想试着写一个做矩阵运算的代码,然后发现一直都无法使用getline()
从文件中读取矩阵。但是我在别的代码中却可以使用getline()
,下面是代码。
#include #include #include #include #include using namespace std; typedef vector> douvec; //产生一个含有矩阵的文件,这里能够正常的产生矩阵文件 void create_file (fstream &file) { int rank; //提示输入产生的矩阵的维度 cout << "input the rank: "; cin >> rank; //随机生成矩阵的数值 srand(time(0)); for (int r = 0; r < rank; r++){ for (int c = 0; c < rank; c++) file << rand()%2 << " "; file << '\n'; } } //讲文件中的矩阵读入一个二维vector中 auto create_matrix (fstream &file) -> vector> { char num; string line; douvec matrix; //这里的getline一直都读取不了文件中的任何的数据 while (getline(file, line)){ stringstream record(line); vector temp; if (line == "") break; while (record >> num){ int number = (int)num; temp.push_back(number); } matrix.push_back(temp); } return matrix; } int main(){ fstream file("file.txt", ofstream::app); douvec matrix; create_file(file); //这里输出的matrix.size()一直都是0 cout << "matrix size is " << matrix.size() << endl; matrix = create_matrix(file); for (int row = 0; row < matrix.size(); ++row){ for (int col = 0; col < matrix[row].size(); ++col) cout << matrix[row][col] << " "; cout << endl; } return 0; }
使用getline读不到文件内容是因为不当使用
两个问题
如果想同时读写一个fstream应该加上对应mode
fstream file("file.txt", ofstream::in | ofstream::app);
c++ fstream 其实只是把C FILE I/O 重新包装而已。
看c++11 N3337 27.9.1.1
看c11 WG14 N1570 7.21.5.3
所以只要在
matrix = create_matrix(file);
前面加上file.seekg(0, std::ios_base::beg);
或其他repositioning就可以了。