【问题标题】:difference in copying a .exe file and text file in c在c中复制.exe文件和文本文件的区别
【发布时间】:2011-12-02 00:00:09
【问题描述】:

我编写了以下代码将文本文件复制到另一个:

     FILE *fpr, *fpw;
     int ch;
     fpr = fopen("M.txt","r");
     fpw = fopen("P.txt","w");
     if(fpr == NULL)
      printf("File open failed!");
     else
     {
       while(1)
        {
          ch = fgetc(fpr);
          if(ch == EOF)
             break;
          fputc(ch, fpw);
         }
       fclose(fpr);
       fclose(fpw);
       printf("Successfully copied!");
     }

效果很好。然后我将int ch 更改为char ch 它也对我有用。但是当我使用以下代码复制 .exe 文件时,文件复制无法正常工作。

     FILE *fpr, *fpw;
     char ch;
     fpr = fopen("M.exe","rb");
     fpw = fopen("P.exe","wb");
     if(fpr == NULL)
       printf("File open failed!");
     else
     {
       while(1)
        {
         ch = fgetc(fpr);
         if(ch == EOF)
           break;
         fputc(ch, fpw);
        }
      fclose(fpr);
      fclose(fpw);
      printf("Successfully copied!");
     }

我将char ch 更改为int ch 然后它工作正常!为什么二进制文件而不是文本文件会发生这种情况?在二进制的情况下使用char ch 会发生什么? 请帮忙... 提前感谢您的反馈。

【问题讨论】:

    标签: c file text binary copy


    【解决方案1】:

    这是因为 char 的 EOF 可能是 0 或 255,它可以显示在二进制文件的中间,但不能显示在文本文件中(这就是为什么只有文本文件对 char 有效)。但是 EOF 是 -1 表示 int 无论如何都不能显示在文件中间(只有 0-255 可以)。

    【讨论】:

    • C 标准说(§7.19.1 <stdio.h>):EOF [...] 扩展为整数常量表达式,类型为 int 和一个负值,由多个函数返回以指示文件结束,即不再有来自流的输入。因此,EOF 不是 0,也不能保证为 -1(尽管这是迄今为止最常见的值)。
    【解决方案2】:

    由于fgetc() 可以返回对应于任何字符的整数加上一个不同的值EOF,因此您不能将其结果存储在char 中,然后可靠地测试EOF。您必须像原来一样使用int

    【讨论】:

    • 确实,在带有未签名char 的系统上,针对EOF 的测试永远不会返回true。
    【解决方案3】:

    fgetc()fputc() 设计用于处理文本数据,而不是二进制数据。请改用fread()fwrite()

    FILE *fpr, *fpw;
    unsigned char b[1024];
    bool ok = false;
    fpr = fopen("M.exe","rb");
    if (fpr == NULL)
        printf("File open M.exe failed!");
    else
    {
        fpw = fopen("P.exe","wb");
        if (fpw == NULL)
            printf("File open P.exe failed!");
        else
        {
            int read;
            while(1)
            {
                read = fread(b, 1, 1024, fpr);
                if (read < 1)
                {
                    if (read == 0)
                      ok = true;
                    break;
                }
                if (fwrite(b, read, 1, fpw) != 1)
                    break;
            }
            fclose(fpw);
        }
        fclose(fpr);
    }
    if (ok)
        printf("Successfully copied!");
    

    【讨论】:

    • 如果你打算用二进制数据做一些事情,fread/fwrite 更有用;但只要文件以二进制模式打开,复制的文件就是正确的。
    猜你喜欢
    • 2011-08-27
    • 2019-08-19
    • 1970-01-01
    • 1970-01-01
    • 2014-01-18
    • 2019-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多