複数のテキスト ファイルをマージして 1 つのファイルを出力するコードを書いています。それぞれ 1400 行を含む最大 22 個の入力テキスト ファイルが存在する可能性があります。各行には 8 ビットのバイナリと改行文字 \n があります。22 個のテキスト ファイルすべてが結合された 1 つのファイルを出力します。
出力ファイルに問題があります。1400 行の後、前のファイルの内容がまだ出力ファイルに配置されているように見えます (前のファイルの長さは 1400 行でしたが)。この余分なコンテンツは、Microsoft Office または Sublime で開いた場合、各行間に追加の行間ができ始めますが、メモ帳または Excel (Excel の 1 つのセル) で開いた場合は 1 行として解釈されます。
以下は、出力ファイルの予想される動作の図です。
これが異常行動の写真です。これは、最初のファイルが終了したときに開始されます。2番目のファイルは00000000から始まるため、このデータは最初のファイルからのものであることはわかっています
そして、これが2番目のファイルの始まりです。
そして、この異常な動作は、ファイルが切り替わるたびに繰り返されます。
これを達成するための私の実装は次のとおりです。
repeat:
if(user_input == 'y')
{
fstream data_out ("data.txt",fstream::out);
for(int i = 0; i<files_found; i++)
{
fstream data_in ((file_names[i].c_str()),fstream::in);
if(data_in.is_open())
{
data_in.seekg(0,data_in.end);
long size = data_in.tellg();
data_in.seekg(0,data_in.beg);
char * buffer = new char[size];
cout << size;
data_in.read(buffer,size);
data_out.write(buffer,size);
delete[] buffer;
}else
{
cout << "Unexpected error";
return 1;
}
data_in.close();
}
data_out.close();
}else if(user_input == 'n')
{
return 1;
}else
{
cout << "Input not recognised. Type y for Yes, and n for No";
cin >> user_input;
goto repeat;
}
さらに詳しい情報:
サイズ変数を確認したところ、予想どおり 14000.8 ビットで、1 行あたり n = 10 文字の \ で、1400 行 x 10 = 14000 です。
コードのリーダーが経験済みであることを前提としています。