我在 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()
的返回值分配给 char
。 fgetc()
返回一个 int
,它或者对应于 unsigned char
或者 是 EOF
,一个 int
常量,它是负数并且与任何有效字符不同。
当您将 EOF
与 char
进行比较时可能会发生以下情况:您的 char
可以签名,因此在二进制文件中,你可以找到一个 -1
的字节,带有签名的 char
。 -1
通常用作 EOF
的 int
(!) 值,因此即使 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/