c - fwrite 创建一个比输入文件大的输出文件

标签 c binaryfiles fwrite

我想按字节读取文件到数组中,然后反转数组的数据 在一个新文件中(程序通过命令行参数获取文件名)。用txt文件尝试过 它有效,但如果我在 jpg 文件上尝试,新文件比原始文件大! 以 long size; 保存的确定的文件大小对于 jpg 文件和写入循环也是正确的 get size-time 执行写入一个字符(字符是一字节大,我是对的?)。 有人知道输出文件如何变得大于 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;
}

最佳答案

您收到的评论暗示着一些事情:与其他一些系统相比,换行符 \n 在 Windows 文本模式下的工作方式有所不同。

如果 file 在文本模式“w”下打开,Windows 上的

fputc('\n', file) 实际上会写入两个字节,就像您所做的那样 fwrite("\r\n", 1, 2, 文件).这意味着对于 fread 读取的任何 \n 字节,您将写回两个字节。

如果要写回二进制数据,则需要使用 "wb"fopen() 模式打开输出文件。您还需要打开它以二进制模式读取,“rb”

关于c - fwrite 创建一个比输入文件大的输出文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24716432/

相关文章:

c - 在文件描述符上使用 fwrite/将文件描述符转换为文件指针

c - 将 fgetc() 的结果可移植地分配给 C 中的 char 的最佳方法

CodeChef 小阶乘解

javascript - 如何在 JavaScript 中将字符串编码为 Base64?

c - Fwrite 似乎总是追加而不是从游标写入

c - 使用 fwrite() 将大块写入文件(例如 1000000000)

c - 这段代码是否真的可以知道系统是小端还是大端?

c - 在二进制文件中读取和写入缓冲区

java - 来自 Java 的 Linux 命令行指令

c - fwrite() 无法在二进制文件中写入整数