我正在编写一个代码来合并多个文本文件并输出一个文件。 最多可以有22个输入文本文件,每个文件包含1400行。 每行有8位二进制和新行字符\ n。 我正在整理一个包含所有22个文本文件的文件。
问题在于我的输出文件,在1400行之后,似乎前一个文件中的内容仍然被放入输出文件中(尽管前一个文件的长度是1400行)。如果由microsoft office或sublime打开,此额外内容也会在每行之间开始有额外的行间距,但如果由记事本或excel(excel中的单个单元格)打开,则会将其解释为单行。
以下是输出文件的预期行为图片,
这是异常行为的图片。这在第一个文件完成时开始。 我知道这个数据来自第一个文件仍然是因为第二个文件从00000000
开始
这是第二个文件的开头,
每次文件切换时都会重复这种异常行为。
我实现这一目标的实现如下:
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。
假设读者有经验。
答案 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;
}