3

Google で満足のいく答えが見つかりませんでした。C++ の I/O は少しトリッキーです。可能であれば、ブロックごとにテキストファイルをベクターに読み込みたいです。残念ながら、方法がわかりませんでした。I/O はトリッキーなので、無限ループがすべての可能性で中断されるかどうかさえわかりません。だから、私が理解できた最良の方法はこれです:

char buffer[1025]; //let's say read by 1024 char block
buffer[1024] = '\0';
std::fstream fin("index.xml");
if (!fin) {
    std::cerr << "Unable to open file";        
} else {
    while (true) {          
        fin.read(buffer, 1024);
        std::cout << buffer;
        if (fin.eof())
            break;
    }

}

'\0' の 2 行目に注意してください。おかしくないですか?もっと良いことはできますか?データを char 配列ではなくベクターに読み込むことはできますか? ベクトルに直接読み込むのは適切ですか?

回答ありがとうございます。

PS。チャンクごとの読み取りには確かに意味があります。このコードは短いですが、循環バッファーに格納しています。

4

3 に答える 3

4

あなたは次のことをうまくやっているはずです

 vector<char> buffer (1024,0);      // create vector of 1024 chars with value 0   
 fin.read(&buffer[0], buffer.size());

ベクター内の要素は連続して格納されることが保証されているため、これは機能するはずですが、ベクターが決して空にならないようにする必要があります。私は最近ここで同様の質問をしました - 標準からの具体的な詳細については、その回答を確認してくださいCan I call functions that take an array/pointer argument using a std::vector instead?

于 2012-09-13T07:20:01.733 に答える
0
std::ifstream fin("index.xml");
std::stringstream buffer;
buffer << fin.rdbuf();
std::string result = buffer.str();

まさにあなたが必要とするもの。

于 2012-09-13T07:20:55.587 に答える