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

时间:2017-08-04 07:47:49

标签: c file copy

我使用gcc-7在Ubuntu中用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行。如果你告诉我什么是错的话会很有帮助???我还是诺布。

1 个答案:

答案 0 :(得分:2)

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

您当前的问题是,您将fgetc()的返回值分配给charfgetc()会返回int,其中 对应unsigned char 的值为EOFint 1}}来自任何有效字符的否定 distinct 的常量。

EOFchar进行比较时可能会发生以下情况:您的char可以签名,因此在二进制文件中,您可以找到{{1}的字节1}}带有签名的-1char通常用作-1的{​​{1}}(!)值,因此即使int 返回{{}},您的比较也会为真{1}}。

修复:将EOF替换为fgetc()

众所周知,将文件逐字节复制非常低效。您最好使用缓冲区并EOF / char forcp;进行复制,如下例中也添加了正确的错误检查:

int forcp;