。,c++,file,binaryfiles,C++,File,Binaryfiles" /> 。,c++,file,binaryfiles,C++,File,Binaryfiles" />

将二进制文件读取到无符号字符数组并将其写入另一个数组 您好,我用C++改写文件有一些问题。我尝试从一个二进制文件中读取数据并将其写入另一个二进制文件 { // Reading size of file FILE * file = fopen("input.txt", "r+"); if (file == NULL) return; fseek(file, 0, SEEK_END); long int size = ftell(file); fclose(file); // Reading data to array of unsigned chars file = fopen("input.txt", "r+"); unsigned char * in = (unsigned char *) malloc(size); for (int i = 0; i < size; i++) in[i] = fgetc(file); fclose(file); file = fopen("output.txt", "w+"); for (int i = 0; i < size; i++) fputc((int)in[i], file); fclose(file); free(in); } { //读取文件大小 FILE*FILE=fopen(“input.txt”、“r+”); if(file==NULL)返回; fseek(文件,0,SEEK_END); long int size=ftell(文件); fclose(文件); //将数据读取到无符号字符数组 file=fopen(“input.txt”,“r+”); 无符号字符*in=(无符号字符*)malloc(大小); 对于(int i=0;i,而不是 Malc 和免费< /代码>。

将二进制文件读取到无符号字符数组并将其写入另一个数组 您好,我用C++改写文件有一些问题。我尝试从一个二进制文件中读取数据并将其写入另一个二进制文件 { // Reading size of file FILE * file = fopen("input.txt", "r+"); if (file == NULL) return; fseek(file, 0, SEEK_END); long int size = ftell(file); fclose(file); // Reading data to array of unsigned chars file = fopen("input.txt", "r+"); unsigned char * in = (unsigned char *) malloc(size); for (int i = 0; i < size; i++) in[i] = fgetc(file); fclose(file); file = fopen("output.txt", "w+"); for (int i = 0; i < size; i++) fputc((int)in[i], file); fclose(file); free(in); } { //读取文件大小 FILE*FILE=fopen(“input.txt”、“r+”); if(file==NULL)返回; fseek(文件,0,SEEK_END); long int size=ftell(文件); fclose(文件); //将数据读取到无符号字符数组 file=fopen(“input.txt”,“r+”); 无符号字符*in=(无符号字符*)malloc(大小); 对于(int i=0;i,而不是 Malc 和免费< /代码>。,c++,file,binaryfiles,C++,File,Binaryfiles,但它会写入缓冲区,并在文件末尾追加一些0xFF字节(它会为小文件追加一些字节,但为大文件追加一些KB)。什么是问题?这并不是真正回答您关于错误在哪里的问题,但我认为这是一种更简单的从一个二进制文件到另一个二进制文件的写入方式: ifstream in(inputFile, ios::binary); ofstream out(outputFile, ios::binary); if(in.is_open() && out.is_open()) while(!in.eof()

但它会写入缓冲区,并在文件末尾追加一些0xFF字节(它会为小文件追加一些字节,但为大文件追加一些KB)。什么是问题?

这并不是真正回答您关于错误在哪里的问题,但我认为这是一种更简单的从一个二进制文件到另一个二进制文件的写入方式:

ifstream in(inputFile, ios::binary);
ofstream out(outputFile, ios::binary);
if(in.is_open() && out.is_open())
   while(!in.eof())
   out.put(in.get());
in.close();
out.close();

您应该投资于
fread
fwrite
,让底层库和操作系统处理循环:

// Reading size of file
FILE * file = fopen("input.txt", "r+");
if (file == NULL) return;
fseek(file, 0, SEEK_END);
long int size = ftell(file);
fclose(file);
// Reading data to array of unsigned chars
file = fopen("input.txt", "r+");
unsigned char * in = (unsigned char *) malloc(size);
int bytes_read = fread(in, sizeof(unsigned char), size, file);
fclose(file);

file = fopen("output.txt", "w+");
int bytes_written = fwrite(out, sizeof(unsigned char), size, file);
fclose(file);
free(in);
如果要执行精确复制而不进行任何字节翻译,请将输入文件打开为“rb”,将输出文件打开为“wb”


您还应该考虑使用<代码>新< /COD>和<代码>删除[]/COD>,而不是<代码> Malc 和<代码>免费< /代码>。 你确定吗?输出文件真的比输入文件大吗?为什么不使用fstream?是的,它在Windows上,输出文件比二进制模式下打开文件的输入文件大,即“rb+”用于读取,“wb+”用于写入。您应该使用

fread
而不是
fgetc
。减少函数调用的数量将加快程序的速度。您可能不需要这个循环。在一行中同样的:STD::OFFROW(“目标”TXT)在C++的精神中…尼斯:)