文件读取 - C++,使用getline一直读取不到文件中的内容
黄舟
黄舟 2017-04-17 14:54:26
0
1
593

想试着写一个做矩阵运算的代码,然后发现一直都无法使用getline()从文件中读取矩阵。但是我在别的代码中却可以使用getline(),下面是代码。

#include <iostream>
#include <fstream>
#include <sstream>
#include <ctime>
#include <vector>

using namespace std;
typedef vector<vector<int>> 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<vector<int>> {
    char num;
    string line;
    douvec matrix;

    //这里的getline一直都读取不了文件中的任何的数据
    while (getline(file, line)){
        stringstream record(line);
        vector<int> 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;

}
黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全員に返信(1)
伊谢尔伦

getline を使用してファイルの内容を読み取れない理由は不適切な使用
2 つの問題

です。
  • fstream の読み取りと書き込みを同時に行う場合は、対応するモード
    fstream file("file.txt", ofstream::in | ofstream::app) を追加する必要があります。 ); p>

  • c++ fstream は、実際には C FILE I/O を再パッケージ化したものにすぎません。
    c++11 N3337 27.9.1.1 を参照

    クラス Basic_filebuf<charT, traits&gt のオブジェクトによって制御されるシーケンスの読み取りおよび書き込みに関する制限は、標準 C ライブラリ FILE の読み取りおよび書き込みの場合と同じです。
    特に:
    ファイルが読み取り用にオープンされていない場合、入力シーケンスを読み取ることはできません。
    — ファイルが書き込み用にオープンされていない場合、出力シーケンスは書き込むことができません。
    — ジョイント ファイルの位置のために維持されます入力シーケンスと出力シーケンスの両方。

    c11 WG14 N1570 7.21.5.3 を見てください

    ファイルが更新モード (上記のモード引数値リストの 2 番目または 3 番目の
    文字として「+」) で開かれると、入力と
    出力は、 関連付けられたストリーム上で実行できますが、 出力
    の呼び出しを介さずに直接入力を続けてはなりません
    。 >fflush 関数またはファイルへ位置決め関数 (fseek、fsetpos、
    または rewind) を使用し、
    ファイル位置決め関数の呼び出しを介さずに入力の直後に出力を続けてはなりません。入力
    操作でファイルの終わりが発生しない限り、更新モードでテキスト ファイルを開く(または作成する)と、代わりにバイナリ ストリームが開かれる(または作成される)場合があります。いくつかの
    実装。

    したがって、
    file.seekg(0, std::ios_base::beg); などを matrix = create_matrix(file); の前に追加するだけです。位置を変えるだけで十分です。

    いいねを押す +0
    人気のチュートリアル
    詳細>
    最新のダウンロード
    詳細>
    ウェブエフェクト
    公式サイト
    サイト素材
    フロントエンドテンプレート