4

複数のテキスト ファイルをマージして 1 つのファイルを出力するコードを書いています。それぞれ 1400 行を含む最大 22 個の入力テキスト ファイルが存在する可能性があります。各行には 8 ビットのバイナリと改行文字 \n があります。22 個のテキスト ファイルすべてが結合された 1 つのファイルを出力します。

出力ファイルに問題があります。1400 行の後、前のファイルの内容がまだ出力ファイルに配置されているように見えます (前のファイルの長さは 1400 行でしたが)。この余分なコンテンツは、Microsoft Office または Sublime で開いた場合、各行間に追加の行間ができ始めますが、メモ帳または Excel (Excel の 1 つのセル) で開いた場合は 1 行として解釈されます。

以下は、出力ファイルの予想される動作の図です。

通常の動作

これが異常行動の写真です。これは、最初のファイルが終了したときに開始されます。2番目のファイルは00000000から始まるため、このデータは最初のファイルからのものであることはわかっています

異常行動

そして、これが2番目のファイルの始まりです。

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 です。

コードのリーダーが経験済みであることを前提としています。

4

1 に答える 1

0

この質問にぶつかって申し訳ありませんが、回答済みのマークが付いている質問が本当に好きです。JoachimPileborg の回答が役に立ったようです:

また、サイズを探してチェックし、メモリを割り当てる代わりに、たとえば data_out << data_in.rdbuf(); を実行してみませんか? これにより、入力ファイル全体が出力にコピーされます。– Joachim Pileborg 7 月 29 日 17:26

リファレンスhttp://www.cplusplus.com/reference/ios/ios/rdbuf/と例:

#include <fstream>
#include <string>
#include <vector>

int main(int argc, char** argv)
{
  typedef std::vector<std::string> Filenames;
  Filenames vecFilenames;

  // Populate the list of file names
  vecFilenames.push_back("Text1.txt");
  vecFilenames.push_back("Text2.txt");
  vecFilenames.push_back("Text3.txt");

  // Merge the files into Output.txt
  std::ofstream fpOutput("Output.txt");
  for (Filenames::iterator it = vecFilenames.begin();
      it != vecFilenames.end(); ++it)
  {
    std::ifstream fpInput(it->c_str());
    fpOutput << fpInput.rdbuf();
    fpInput.close();
  }
  fpOutput.close();

  return 0;
}
于 2013-09-15T08:08:36.287 に答える