user-0 提问: 关于fgetc(stdin)返回负数

回复:
user: user-1

user: user-0
content: 引用 12 楼 zhao4zhong1 的回复:不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  //test.c #include <stdio.h> int main() {     int c;     unsigned char uc;     while (1) {         c=fgetc(stdin);         if (EOF==c) break;         uc=(unsigned char)c;         printf("0x%02X ",uc);     }     return 0; } //C:\tmp>hexdump ff.dat //00000000 - 01 02 81 82 ff fe ff ff // //C:\tmp>test < ff.dat //0x01 0x02 0x81 0x82 0xFF 0xFE 0xFF 0xFF   赵老师您太厉害了，用您的确实没问题，我也回过头去看了我之前的代码，可能是当时熬夜太晚脑子糊涂了，本来没问题的代码被注释了，然后有问题的代码是先赋值给了char数组再判断的，真的是糊涂了，多谢老师您醍醐灌顶！话说老师您真活跃，经常看到您的身影呢！

user: user-1
content: 不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  //test.c #include <stdio.h> int main() {     int c;     unsigned char uc;     while (1) {         c=fgetc(stdin);         if (EOF==c) break;         uc=(unsigned char)c;         printf("0x%02X ",uc);     }     return 0; } //C:\tmp>hexdump ff.dat //00000000 - 01 02 81 82 ff fe ff ff // //C:\tmp>test < ff.dat //0x01 0x02 0x81 0x82 0xFF 0xFE 0xFF 0xFF

user: user-2
content: int fgetc(FILE *stream)   你需要注意的是 fgetc 返回的是 int 类型的值，在正常读取的情况下，返回的整数均小于 256，即 0x00~0xFF，而结束符 EOF通常定义为 -1，其值是 0xFFFF 或者 0xFFFFFFFF。  引用 楼主 weixin_39158150 的回复:用fgetc读文件流，每个字节都是正数，因此可以用-1表示结尾，但是用fgetc读标准输入，得到的值不是0-255了，而是-128-127，为什么会这样？这样无法判断输入的结束了吗？   事情的起因是我想直接把手机截图存进数组，代码为 adb shell screencap | 我的程序 ，当输入的图片数据全部结束后，它就会一直输入-1， 用echo abc | 我的程序 测试了也一样。求助，想判断输入的结尾。

user: user-0
content: 引用 2 楼 sghcpt 的回复:楼主，能不能先把你截图的图片保存到文件中，然后再调用fgetc读取文件流，看看是否也有负数出现，如果是，那么应该就是图片中数据涉及到使用负数表示的值了。。那么就想其它办法解决了。。 “想判断输入的结尾”至于判断结尾，如果上面都不好判断，那么还是把数据保存到文件，判断读取文件是否结束比较好处理点。 这个方法肯定可以，二进制文件都差不多，只是fgetc读文件的取的每个字节是0-255，所以能正常用EOF判断结尾，但直接输入的方式可以为负数，这样EOF就没有了意义。方法是可以，就是效率太低了。

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:int c; unsigned char uc; whie (1) {  c=fgetc(stdin);  if (EOF==c) break;  uc=(unsigned char)c;  printf("0x%02X ",uc); }  赵老师，这个应该是不可以的吧，接收标准输入的范围在-128 - 127，每个字节都有可能出现-1，怎么能用-1来判断结尾呢？

user: user-0
content: 引用 1 楼 Slzde_sub 的回复:  应该是signed char  和 unsigned char的关系  你可以尝试转换一下，，我没用过这个函数  不太清楚 不可能的，用unsigned就不可能得到-1，也就是得不到EOF

user: user-1
content: int c; unsigned char uc; whie (1) {  c=fgetc(stdin);  if (EOF==c) break;  uc=(unsigned char)c;  printf("0x%02X ",uc); }

user: user-0
content: 引用 10 楼 turingo 的回复:看我7楼的回复，要按照16位或者32位来理解-1，一个字节0xff是255而不要理解为-1。  [quote=引用 9 楼 weixin_39158150 的回复:] [quote=引用 8 楼 user-4 的回复:] 连续读取到与图片大小相同数量的-1，作为结尾。 也就是读取两张图片，一张是原图，一张是全是-1的图。 如果事先知道图片有多大的话，那我直接获取图片大小的数据就行了，何必再获取多一倍的数据来判断[/quote][/quote] fgetc(stdin)从标准输入读取，-1可太多了，如果是白色图片，基本上全是-1，范围都只要-127 - 128，没有255

user: user-3
content: 楼主，能不能先把你截图的图片保存到文件中，然后再调用fgetc读取文件流，看看是否也有负数出现，如果是，那么应该就是图片中数据涉及到使用负数表示的值了。。那么就想其它办法解决了。。 “想判断输入的结尾”至于判断结尾，如果上面都不好判断，那么还是把数据保存到文件，判断读取文件是否结束比较好处理点。

user: user-2
content: 看我7楼的回复，要按照16位或者32位来理解-1，一个字节0xff是255而不要理解为-1。  引用 9 楼 weixin_39158150 的回复:[quote=引用 8 楼 user-4 的回复:] 连续读取到与图片大小相同数量的-1，作为结尾。 也就是读取两张图片，一张是原图，一张是全是-1的图。 如果事先知道图片有多大的话，那我直接获取图片大小的数据就行了，何必再获取多一倍的数据来判断[/quote]

user: user-0
content: 引用 8 楼 user-4 的回复:连续读取到与图片大小相同数量的-1，作为结尾。 也就是读取两张图片，一张是原图，一张是全是-1的图。 如果事先知道图片有多大的话，那我直接获取图片大小的数据就行了，何必再获取多一倍的数据来判断

user: user-4
content: 连续读取到与图片大小相同数量的-1，作为结尾。 也就是读取两张图片，一张是原图，一张是全是-1的图。