c - 将数据从一个文件复制到另一个文件时出错

标签 c

我想将数据从一个文件复制到另一个文件。但只有一个字节正在复制。

#include<stdio.h>

void main() {
   FILE *fp1, *fp2;
   char a;

   fp1 = fopen("test.jpg", "r");
   if (fp1 == NULL) {
      puts("cannot open this file");
      exit(1);
   }

   fp2 = fopen("test1.jpg", "w+");
   if (fp2 == NULL) {
      puts("Not able to open this file");
      fclose(fp1);
      exit(1);
   }

   do {
      a = fgetc(fp1);
      fputc(a, fp2);
   } while (a != EOF);

   fcloseall();
}

test.jpg 由数据 ff d8 32 86 ..... 但它只复制 ff 并从 while 循环中出来。我做错了什么吗

最佳答案

a声明为int,而不是char

int a;

否则,第一个 0xFF 会扩展为 -1 (EOF)。

您还应该使用 b (表示“二进制”)打开/关闭文件:

fp1 = fopen("test.jpg", "rb");

// ...

fp2 = fopen("test1.jpg", "w+b");

并且,正如 Drew 所指出的,在写入字符之前检查EOF:

while ((a = fgetc(fp1)) != EOF) {
  fputc(a, fp2);
}

关于c - 将数据从一个文件复制到另一个文件时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25139792/

相关文章:

c - PyCUDA 无法包含 <curand_kernel.h> - 错误 : no extern "C" linkage

c - 是否可以使用预处理器(宏)将 C 字符串文字转换为大写?

c - 是否需要将 '\n' 提供给 C 中的 printf()?

c - 确定矩形是否重叠,如果重叠则返回重叠矩形的面积与给定集合的比较

检查文件是否存在于 C 中

c - 嵌入式C中的驱动程序和库有什么区别

c - Oracle 相当于 Ingres enquire_sql 或 enquire_ingres?

c - 我有一个链表,我想删除重复的值

c - 使用系统 ("/bin/stty raw"时的奇怪输出行为)

c++ - 为 C++ 可执行文件提供变量作为 MATLAB 系统命令的输入参数