我无法将两个文件合并为第三个文件
I cant merge two files in a third one
当我显示第三个文件时,我的问题如下,它显示了很多 0 而不是文件 1 和文件 2 的整数。由于某种原因,我的文件以 4,00 KB(4.096 字节)结尾我不知道。
顺便说一句,第三个文件应该首先是:file1 的第一个 int,然后是 file2 的第一个,依此类推
编辑:我正在测试这个问题,在显示之前我发现第三个文件的大小是正确的。它是 24,这是文件 1 和文件 2 的总和。但是当我读到它时,它变得疯狂
#include <iostream>
using namespace std;
int main()
{
int buffer1, buffer2, buffer3;
//What is written in file 1 and file 2
int file1_content[] = {1,3,5};
int file2_content[] = {2,4,6};
FILE* f3, *f1, *f2;
f1 = fopen("archivo1", "rb");
f2 = fopen("archivo2", "rb");
f3 = fopen("archivo3", "wb+");
if(!f1)
{
cout<<"Error el archivo 1 no se pudo abrir"<<endl;
return 1;
}
if(!f2)
{
cout<<"Error el archivo 2 no se pudo abrir"<<endl;
return 1;
}
if(!f3)
{
cout<<"Error el archivo 3 no se pudo abrir"<<endl;
return 1;
}
//write file 1 and file two in file 3
while(fread(&buffer1, sizeof(int), 1, f1) && fread(&buffer2, sizeof(int), 1, f2) )
{
fwrite(&buffer1, sizeof(int), 1, f3);
fwrite(&buffer2, sizeof(int), 1, f3);
}
fclose(f1);
fclose(f2);
//show file 3
while(fread(&buffer3, sizeof(int), 1, f3))
{
cout<<buffer3<<" ";
}
//EXPECTED OUTPUT
//1 2 3 4 5 6
fclose(f3);
return 0;
}
您的代码有未定义的行为。
根据 §7.21.5.3 ¶7 of the ISO C11 standard,以更新模式 (+
) 打开文件时,以下限制适用:
- 在没有对
fflush
函数或文件定位函数(fseek
、fsetpos
或 rewind
的中间调用的情况下,输出不得直接跟在输入之后).
- 除非输入操作遇到 end-of-file.
,否则在不调用文件定位函数的情况下,输入不得直接跟在输出之后
在您的程序中,您违反了规则 #1。最简单的解决方案是在对 fwrite
和 fread
的调用之间添加对 rewind
的调用,无论如何你都应该这样做,因为你想从文件的开头开始读取。
当我显示第三个文件时,我的问题如下,它显示了很多 0 而不是文件 1 和文件 2 的整数。由于某种原因,我的文件以 4,00 KB(4.096 字节)结尾我不知道。 顺便说一句,第三个文件应该首先是:file1 的第一个 int,然后是 file2 的第一个,依此类推
编辑:我正在测试这个问题,在显示之前我发现第三个文件的大小是正确的。它是 24,这是文件 1 和文件 2 的总和。但是当我读到它时,它变得疯狂
#include <iostream>
using namespace std;
int main()
{
int buffer1, buffer2, buffer3;
//What is written in file 1 and file 2
int file1_content[] = {1,3,5};
int file2_content[] = {2,4,6};
FILE* f3, *f1, *f2;
f1 = fopen("archivo1", "rb");
f2 = fopen("archivo2", "rb");
f3 = fopen("archivo3", "wb+");
if(!f1)
{
cout<<"Error el archivo 1 no se pudo abrir"<<endl;
return 1;
}
if(!f2)
{
cout<<"Error el archivo 2 no se pudo abrir"<<endl;
return 1;
}
if(!f3)
{
cout<<"Error el archivo 3 no se pudo abrir"<<endl;
return 1;
}
//write file 1 and file two in file 3
while(fread(&buffer1, sizeof(int), 1, f1) && fread(&buffer2, sizeof(int), 1, f2) )
{
fwrite(&buffer1, sizeof(int), 1, f3);
fwrite(&buffer2, sizeof(int), 1, f3);
}
fclose(f1);
fclose(f2);
//show file 3
while(fread(&buffer3, sizeof(int), 1, f3))
{
cout<<buffer3<<" ";
}
//EXPECTED OUTPUT
//1 2 3 4 5 6
fclose(f3);
return 0;
}
您的代码有未定义的行为。
根据 §7.21.5.3 ¶7 of the ISO C11 standard,以更新模式 (+
) 打开文件时,以下限制适用:
- 在没有对
fflush
函数或文件定位函数(fseek
、fsetpos
或rewind
的中间调用的情况下,输出不得直接跟在输入之后). - 除非输入操作遇到 end-of-file. ,否则在不调用文件定位函数的情况下,输入不得直接跟在输出之后
在您的程序中,您违反了规则 #1。最简单的解决方案是在对 fwrite
和 fread
的调用之间添加对 rewind
的调用,无论如何你都应该这样做,因为你想从文件的开头开始读取。