C++中定义了输入输出流将程序与文件进行了连接,下面对常用的程序读取与输出txt和csv文件流程进行记录。
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"); if (out.fail()) { cout<<"打开文件错误!"<<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> #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> #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; }
|