10

fstream で読み取るたびに、最後に余分な文字が 1 つ表示されます。これを回避するにはどうすればよいですか?

編集:

ifstream readfile(inputFile);
ofstream writefile(outputFile);
char c;
while(!readfile.eof()){
      readfile >> c;
      //c = shiftChar(c, RIGHT, shift);
      writefile << c;
}
readfile.close();
writefile.close();
4

2 に答える 2

9

これは通常、ファイルの終わりを誤ってテストした結果です。通常、次のようなことをしたいと思います。

while (infile>>variable) ...

また:

while (std::getline(infile, whatever)) ...

だがしかし:

while (infile.good()) ...

また:

while (!infile.eof()) ...

最初の2つは読み取りを行い、失敗したかどうかを確認し、失敗した場合はループを終了します。後者の2つは読み取りを試み、変数にあるものを処理し、前の試みが失敗した場合は次の反復でループを終了します。最後の反復では、読み取りに失敗した後の変数の内容は通常、以前の内容であるため、2番目の2つのループのいずれかのようなループは、通常、ファイルの最後の項目を2回処理するように見えます。

あるファイルを別のファイルに簡単にコピーするには、次のようなものを使用することを検討してください。

// open the files:
ifstream readfile(inputFile);
ofstream writefile(outputFile);

// do the copy:
writefile << readfile.rdbuf();

これは小さなファイルではうまく機能しますが、大きなファイルでは大幅に遅くなる可能性があります。このような場合、通常、read1つのファイルから別のファイルにingするループを使用する必要がありますwrite。これには、微妙なエラーの可能性もあります。テストされ、一般的に適切に機能する1つの方法は、次のようになります。

    std::ifstream input(in_filename, std::ios::binary);
    std::ofstream output(out_filename, std::ios::binary);

    const size_t buffer_size = 512 * 1024;
    char buffer[buffer_size];

    std::size_t read_size;
    while (input.read(buffer, buffer_size), (read_size = input.gcount()) > 0)
        output.write(buffer, input.gcount());
于 2010-05-06T19:27:17.293 に答える
0

コードに基づいて、あなたがやろうとしていることは、あるファイルの内容を別のファイルにコピーすることであるように見えますか?

もしそうなら、私はこのようなものを試してみます:

ifstream fin(inputFile, ios::binary);

fin.seekg(0, ios::end);
long fileSize = fin.tellg();
fin.seekg(0, ios::beg);

char *pBuff = new char[fileSize];
fin.read(pBuff, fileSize);
fin.close();

ofstream fout(outputFile, ios::binary)
fout.write(pBuff, fileSize);
fout.close;
delete [] pBuff;
于 2010-05-06T19:42:19.623 に答える