gpt4 book ai didi

c - 为什么 fgetc() 返回 int 而不是 char?

转载 作者:太空宇宙 更新时间:2023-11-04 00:28:29 26 4
gpt4 key购买 nike

我想将二进制文件源复制到文件目标。而已!该代码的灵感来自互联网上的许多示例。

#include <stdio.h>

int main(int argc, char **argv) {

FILE *fp1, *fp2;
char ch;

fp1 = fopen("source.pdf", "r");
fp2 = fopen("target.pdf", "w");

while((ch = fgetc(fp1)) != EOF)
fputc(ch, fp2);

fclose(fp1);
fclose(fp2);

return 0;

}

结果在文件大小上有所不同。

root@vm:/home/coder/test# ls -l
-rwxr-x--- 1 root root 14593 Feb 28 10:24 source.pdf
-rw-r--r-- 1 root root 159 Mar 1 20:19 target.pdf

好的,那有什么问题呢?

我知道 char 是无符号的,当超过 80 时会被签名。参见 here .

这在我使用 printf("%x\n", ch); 时得到证实,它有时会返回类似 FFFFFFE1 的大约 50% 的时间。

我的问题的解决方案是使用 int i.s.o。 字符.

使用 char 找到的示例:example 1 , example 2 example 3 , example 4 , ...

使用 int 找到的示例:example a , ...

我不使用花哨的编译器选项。

为什么几乎所有的代码示例都将 fgetc() 返回到 char i.s.o. int,哪个更正确?

我错过了什么?

最佳答案

ISO C 要求 fgetc()返回 int因为它必须能够返回所有可能的字符以及文件结束指示符。

所以将返回值放入 char 的代码、用它来检测 EOF,通常是完全错误的,不应使用。


话虽如此,您提供的示例中有两个实际上并没有这样做。

其中一个使用 fseekftell获取文件中的字节数,然后使用 that 来控制读/写循环。这可能会有问题,因为文件的大小实际上可以在 检索到大小后发生变化,但这与尝试强制执行 int 是不同的问题。进入char .

其他用途feof读取字符后立即检查是否已到达文件末尾。


但是你是对的,最简单的方法是简单地正确使用返回值,比如:

int charInt;
while ((charInt = fgetc(inputHandle)) != EOF)
doSomethingWith(charInt);

关于c - 为什么 fgetc() 返回 int 而不是 char?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49063518/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com