c++中如何把想写的内容输出到txt中

来源:互联网 发布:京东优惠券软件 编辑:程序博客网 时间:2024/05/20 16:00

1,需要包含头文件#include <fstream>

ifstream infile("F:\\1.txt")这是读入文件;

ofstream outfile("F:\\2.txt")这是写出文件,若这个2.txt不存在,将会自动生成。

2,下边看一个实例,比如一个无向不确定图(即图无向且边上有大小属于0到1的权值),它本来的txt文件如下:

test1.txt

9 28
1 2 0.6
1 3 0.5
2 1 0.6
2 3 0.4
2 5 0.7
3 1 0.5
3 2 0.4
3 4 0.5
3 5 0.1
4 3 0.5
4 5 0.2
5 2 0.7
5 3 0.1
5 4 0.2
5 6 0.4
6 5 0.4
6 7 0.7
6 8 0.9
6 9 0.8
7 6 0.7
7 8 0.7
7 9 0.6
8 6 0.9
8 7 0.7
8 9 0.6
9 6 0.8
9 7 0.6
9 8 0.6

这种格式是:第一行是顶点个数和边条数;

其它行是:边的出发顶点     边的到达顶点     边的权值

我想把它读进去变成另外一种格式:第一行仍然是顶点个数和边条数,其它行格式为:边的出发顶点    该出发顶点的邻接点个数    其中一个到达顶点      该边权值     继续!

先读进去:

各种头文件,可借鉴前一篇在不确定图中求极大团的文章。

ReadFile.h#pragma once#include "UDG.h"#define path "F:\\test1.txt"class ReadFile{public:ReadFile(void);~ReadFile(void);void CreateUdg(UDG &g);};
ReadFile.cpp#include "StdAfx.h"#include "ReadFile.h"#include <fstream>#include <iostream>using namespace std;ReadFile::ReadFile(void){}ReadFile::~ReadFile(void){}void ReadFile::CreateUdg(UDG &g){ifstream infile(path);cout << "开始读入文件!" << endl;infile >> g.vernum >> g.arcnum;cout << "顶点个数和边数为:" << endl;cout << g.vernum << ' ' << g.arcnum << endl;g.AdjVector = new node[g.vernum + 1];//0号不存结点cout << "开始读入边,建立邻接vector!" << endl;int i;for (i = 0; i < g.arcnum; i++){int head, tail;float val;infile >> head >> tail >> val;g.AdjVector[head].vertex = head;Vertex_Value temp;temp.vertex = tail;temp.val = val;g.AdjVector[head].vec.push_back(temp);}}
存好后,我想把它写入一个test11.txt文件中,这样下次读图的时候,我用这个test11.txt文件会比之前快。

void BasicFunctions::outputtxt(UDG g){ofstream outfile("F:\\test11.txt");int i;unsigned int j;for (i = 0; i <= g.vernum; i++){if (i == 0){outfile << g.vernum << ' ' << g.arcnum << endl;}else{outfile << g.AdjVector[i].vertex << ' ' << g.AdjVector[i].vec.size() << ' ';for (j = 0; j < g.AdjVector[i].vec.size(); j++){outfile << g.AdjVector[i].vec[j].vertex << ' ' << g.AdjVector[i].vec[j].val << ' ';}outfile << endl;}}outfile.close();}

这样执行完后,我们看test11.txt中内容为:

9 28
1 2 2 0.6 3 0.5 
2 3 1 0.6 3 0.4 5 0.7 
3 4 1 0.5 2 0.4 4 0.5 5 0.1 
4 2 3 0.5 5 0.2 
5 4 2 0.7 3 0.1 4 0.2 6 0.4 
6 4 5 0.4 7 0.7 8 0.9 9 0.8 
7 3 6 0.7 8 0.7 9 0.6 
8 3 6 0.9 7 0.7 9 0.6 
9 3 6 0.8 7 0.6 8 0.6 

这样我在下次读txt时,可事先给定vector的大小,而不必多次分配空间,浪费时间了。

那么对于这样的文件该怎么读呢?

下边是简单代码:

#include "StdAfx.h"#include "ReadFile.h"#include <sstream>#include <fstream>#include <iostream>using namespace std;ReadFile::ReadFile(void){}ReadFile::~ReadFile(void){}void ReadFile::CreateUdg(UDG &g){//ifstream infile("F:\\test11.txt");ifstream infile(path);cout << "读入文件!" << endl;string temp;stringstream ss;getline(infile, temp);ss << temp;ss >> g.vernum >> g.arcnum;cout << "输出顶点个数和边的条数!" << endl;cout << g.vernum << ' ' << g.arcnum << endl;g.AdjVector = new node[g.vernum + 1];//0号不存结点cout << "开始读入边,建立邻接vector!" << endl;int i;unsigned int j;int tail, num;for (i = 0; i < g.vernum; i++){//stringstream ss;ss.clear();getline(infile, temp);ss << temp;ss >> tail >> num;g.AdjVector[tail].vec.resize(num);//读取到大小后重新给vector初始化大小//cout << head  << num;for (j = 0; j < g.AdjVector[tail].vec.size(); j++){ss >> g.AdjVector[tail].vec[j].vertex >> g.AdjVector[tail].vec[j].val;}}infile.close();}
这就又引出了sstream中stringstream的问题和getline函数的知识点。

1 0
原创粉丝点击