将数据从文件复制并粘贴到另一个文件时出错

时间:2013-07-29 15:52:51

标签: c++ c++11

我正在编写一个代码来合并多个文本文件并输出一个文件。 最多可以有22个输入文本文件,每个文件包含1400行。 每行有8位二进制和新行字符\ n。 我正在整理一个包含所有22个文本文件的文件。

问题在于我的输出文件,在1400行之后,似乎前一个文件中的内容仍然被放入输出文件中(尽管前一个文件的长度是1400行)。如果由microsoft office或sublime打开,此额外内容也会在每行之间开始有额外的行间距,但如果由记事本或excel(excel中的单个单元格)打开,则会将其解释为单行。

以下是输出文件的预期行为图片,

Normal Behaviour

这是异常行为的图片。这在第一个文件完成时开始。 我知道这个数据来自第一个文件仍然是因为第二个文件从00000000

开始

Abnormal Behaviour

这是第二个文件的开头,

Begin of the second file

每次文件切换时都会重复这种异常行为。

我实现这一目标的实现如下:

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;
}

更多信息:

我检查了size变量,它正如我所料,14000。 8位,每行n = 10个字符\ 1400行x 10 = 14000。

假设读者有经验。

1 个答案:

答案 0 :(得分:0)

很抱歉提出这个问题,但我真的很喜欢被标记为已回答的问题。 JoachimPileborg的答案似乎对你有用:

  

此外,不是寻找和检查大小和分配内存,为什么   不只是做例如data_out&lt;&lt; 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;
}