c - 无法通过c程序复制二进制文件

标签 c file copy

我在 Ubuntu 中使用 gcc-7 用 c 编写了一个程序。我有 sambleb.out 文件,它是可执行的。我想使用 c 编程复制该文件。这是程序。

#include <stdio.h>
int main()
{
    FILE *fp;
    fp = fopen("sampleb.out","rb");

    FILE *fpcp;
    fpcp = fopen("cp-of-sampleb.out","wb");

    char forcp;
    while (1)
    {
        forcp = fgetc(fp);
        if(forcp == EOF)
            break;
        fputc(forcp, fpcp);
    }

    fclose(fp);
    fclose(fpcp);
}

当我编译程序并执行它时,出现段错误。

 $ a.out && chmod a+x cp-of-sampleb.out
 $ ./cp-of-sampleb.out
 Segmentation fault

这里是cp-of-sample.out的内容

$ cat cp-of-sampleb.out 
ELF>0@@@@8  @@@@@@��88@8@@@,, `` ( 
((`(`��TT@T@DDP�td@@44Q�tdR�td``��/lib64/ld-
linux-x86-64.so.2GNU GNUX�T3�O���t�R�b�Ss�F
                                                  $ 
libc.so.6printf__libc_start_main__gmon_start__GLIBC_2.2.5ui 
3�`` `H�H�%
             H��t�CH��

和sampleb.out的内容

$ cat sampleb.out 
ELF>0@@@@8  @@@@@@��88@8@@@,, `` ( 
((`(`��TT@T@DDP�td@@44Q�tdR�td``��/lib64/ld-
linux-x86-64.so.2GNU GNUX�T3�O���t�R�b�Ss�F
                                                  $ 
libc.so.6printf__libc_start_main__gmon_start__GLIBC_2.2.5ui 
3�`` `H�H�%
             H��t�CH���5
                          �%
                             @�%
                                 h������%

h������%�
]�8`��D]�fD�8`UH��8`H��H��H��H��?
H�H��t�H��tU�8`H=8`H��t�H��t
                                                ]�8`��]�fD�=a

uUH���~����O

]�D��@f.�UH��]��UH�忸@�������]�f.�DAWAVA��AUATL�% UH�- 
SI��I��L)�H�H���g���H��t 
1��L��L��D��A��H��H9�u�H�[]A\A]A^A_Ðf.���H�H��how are you I am 
fine this singale line is printed by multiline 
printf;4�����0���P����0��������zRx

�����*zRx

�$h���0FJ
U                                                                                         
�?;*3$"DW���A�C
Dd`���eB�B�E �B(�H0�H8�M@r8A0A(B BB�����@�@
�@` `���o�@@�@                                   �@
?
 `0�@�  ���o`@���o���oX@(`@@GCC: (Ubuntu 7.1.0-
5ubuntu2~16.04) 7.1.08@T@t@�@�@@X@`@    �@
�@
   �@
@0@�@�@@8@` `(`�``(`8`��
                                                       `@�@!
�@78`F `m@y`������(@���(`(���`�(`(8`8�08)8h�    P�

(我没有发布最后一行,因为它们太多了)。因此我可以看到我的程序只处理前 7 行。如果你告诉我哪里出了问题,这将非常有帮助???我还是菜鸟。

最佳答案

首先,任何此类程序都应在继续之前检查 fopen() 的结果。如果您不这样做,您可能会使用从 fopen() 返回的 NULL 指针,以防出现故障,您的程序将崩溃。

您的直接问题是您将 fgetc() 的返回值分配给 charfgetc() 返回一个 int,它或者对应于 unsigned char 或者EOF,一个 int 常量,它是负数并且与任何有效字符不同

当您将 EOFchar 进行比较时可能会发生以下情况:您的 char 可以签名,因此在二进制文件中,你可以找到一个 -1 的字节,带有签名的 char-1 通常用作 EOFint (!) 值,因此即使 fgetc() 没有返回EOF

修复:将 char forcp; 替换为 int forcp;

总而言之,逐字节复制文件的效率非常低。您最好使用缓冲区和 fread()/fwrite() 进行复制,就像下面的示例一样,它也添加了适当的错误检查:

#include <stdio.h>

#define BUFFERSIZE 8192  // 8 kiB

int main(int argc, char **argv)
{
    if (argc != 3)
    {
        fprintf(stderr, "Usage: %s source dest\n", argv[0]);
        return 1;
    }

    FILE *src = fopen(argv[1], "rb");
    if (!src)
    {
        fprintf(stderr, "Error opening %s for reading.\n", argv[1]);
        return 1;
    }

    FILE *dst = fopen(argv[2], "wb");
    if (!dst)
    {
        fclose(src);
        fprintf(stderr, "Error opening %s for writing.\n", argv[2]);
        return 1;
    }

    char buf[BUFFERSIZE];
    int rc = 1; // <- failure
    do
    {
        size_t nread = fread(buf, 1, BUFFERSIZE, src);
        if (nread < BUFFERSIZE)
        {
            if (ferror(src))
            {
                fprintf(stderr, "Error reading from %s.\n", argv[1]);
                goto done;
            }
            if (!nread) break;
        }

        if (fwrite(buf, 1, nread, dst) < nread)
        {
            fprintf(stderr, "Error writing to %s.\n", argv[2]);
            goto done;
        }
    } while (!feof(src));

    rc = 0; // <- success

done:
    fclose(dst);
    fclose(src);
    return rc;
}

关于c - 无法通过c程序复制二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45501041/

相关文章:

java - 是否可以将java结果发送到c程序

c - 从内核空间执行 ioctl

C++ ~ 在客户端调用函数给出错误 : "identifier ____ is undefined"

ant - 如何使用 Ant 复制文件夹?

javascript - 创建多维数组的副本,而不是引用 - JavaScript

objective-c - 将特定文件从一个路径复制到另一个路径

c - 检查字符串的标记方法

java - 忽略文件中的数字

file - 是否可以使用 Pandas 的 read_csv 读取分类列?

c++ - C++中静态变量的存储位置是什么时候确定的?