C++中定义了输入输出流将程序与文件进行了连接,下面对常用的程序读取与输出txt和csv文件流程进行记录。

image-20220817195038936

1. 写入文件

写入文件主要使用ofstream类对文件操作,操作步骤为包含文件输入输出的头文件;创建流并打开文件;使用重载的<<运算符进行文件写入;写入完毕,关闭文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
#include <fstream>//文件读写的类

using namespace std;

int main()
{
int test[100];

ofstream out;
out.open("test.csv");//文件打开
//或者直接使用 ofstream out("test.txt");
if (out.fail()) {
cout<<"打开文件错误!"<<endl;
}

//写文件,csv以逗号分隔两个数据(txt可自定义分隔),endl换行
for (int i = 0;i < 100;i++) {
out << test[i] << ",";
}
out << endl;

out.close();//关闭文件

return 0;
}

2. 读取文件

读取文件使用ifstream类进行操作,流程与写入时相同,读取时除了可以使用重载的>>运算符(逐词读取),还可以使用getline()函数(逐行读取)。

使用cin 和 >> 运算符来输入字符串时,当 cin 读取数据时,它会传递并忽略任何前导白色空格字符(空格、制表符或换行符),一旦它接触到第一个非空格字符即开始阅读,当它读取到下一个空白字符时,它将停止读取;

这里使用的getline()函数定义在头文件string,其四种重载形式如下,其将一个输入流is读取字符串放到str中,默认的停止符delim为’\n’,也就是回车换行符(即遇到换行停止读入),也可以自定义修改这个停止符,如改为’,'等。

1
2
3
4
istream& getline (istream& is, string& str, char delim);
istream& getline (istream&& is, string& str, char delim);
istream& getline (istream& is, string& str);
istream& getline (istream&& is, string& str);

在getline()读取很长的字符串后可以使用isstringstream进行分割字符串。isstringstream包含于stringstream标准类库(头文件sstream),该类库可以向string写入数据,从string读取数据,就像string是一个IO流一样,istringstream完成从string读取数据。使用时先将string类型的字符串放入isstringstream流中,然后使用重载的>>逐词读取。

2.1 读取空格分隔的txt文件

下面记录将空格为分隔的txt文件读取得到一个二维数组:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
#include <fstream>
#include <sstream>//支持C++风格的串流的输入输出操作
#include <vector>

using namespace std;

int main()
{
ifstream in("test.txt");

string rowData;//一行内容
istringstream iss;
string dataVal;
vector<vector<double>>dataVec;

while (getline(in, rowData))
{
iss.clear();
iss.str(rowData);//将一行的内容放入流中
vector<double>rowDataVec;

while (iss >> dataVal)
{
rowDataVec.push_back(atof(dataVal.c_str()));
}

dataVec.push_back(rowDataVec);
}

in.close();

return 0;
}

2.2 读取csv文件

读取csv文件到二维数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
#include <fstream>
#include <sstream>//支持C++风格的串流的输入输出操作
#include <vector>

using namespace std;

int main()
{
ifstream infile("test.csv");
string line;
vector<vector<double>>dataVec;

while (getline(infile, line))
{
istringstream sin(line);
vector<double> rowDataVec;
string dataVal;
while (getline(sin, dataVal, ','))
{
rowDataVec.push_back(atof(dataVal.c_str()));
}
dataVec.push_back(rowDataVec);
}

return 0;
}