use*_*921 2 c binaryfiles fwrite
我想按字节将文件读入数组,然后将数组的数据反转写入新文件中(程序通过命令行参数获取文件名)。用 txt 文件尝试过,它有效,但如果我在 jpg 文件上尝试,新文件比原始文件大!确定的文件大小以long size保存;对于 jpg 文件来说也是正确的,并且写入循环获取大小时间执行写入一个字符(字符是一个字节大,我是对的?)。有谁知道输出文件如何变得大于 size*byte?
对我来说这似乎不符合逻辑!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc,char* argv[])
{
FILE *file;
char *buffer;
long size;
char filename[32];
if(argc>1)
{
//determine file size
file=fopen(argv[1],"r");
fseek(file,0,SEEK_END);
size=ftell(file);
rewind(file);
if(size>33554432) //32MB
{
fclose(file);
return 0;
}
//create buffer and read file content
buffer=malloc(33554432);
fread(buffer,1,size,file);
fclose(file);
//create new file name and write new file
strcpy(filename,argv[1]);
strcat(filename,"_");
file=fopen(filename,"w");
{
long i;
for(i=size-1;i>=0;i--)
{
fputc(buffer[i],file);
}
}
fclose(file);
free(buffer);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
小智 5
您收到的评论暗示着一些事情:\n与其他一些系统相比,Windows 上文本模式下的换行符的工作方式有所不同。
fputc('\n', file)在 Windows 上,如果以文本模式“w”打开,实际上会写入两个字节file,就像您所做的那样fwrite("\r\n", 1, 2, file)。\n这意味着对于读取的任何字节fread,您将写回两个字节。
如果要写回二进制数据,则需要使用 模式打开输出"wb"文件fopen()。您还需要打开它以二进制模式读取"rb"。