关于fgetc(stdin)返回负数

六道佩恩 2018-08-23 11:47:34
用fgetc读文件流,每个字节都是正数,因此可以用-1表示结尾,但是用fgetc读标准输入,得到的值不是0-255了,而是-128-127,为什么会这样?这样无法判断输入的结束了吗? 事情的起因是我想直接把手机截图存进数组,代码为 adb shell screencap | 我的程序 ,当输入的图片数据全部结束后,它就会一直输入-1, 用echo abc | 我的程序 测试了也一样。求助,想判断输入的结尾。
...全文
619 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-08-29
  • 打赏
  • 举报
回复
六道佩恩 2018-08-28
  • 打赏
  • 举报
回复
引用 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数组再判断的,真的是糊涂了,多谢老师您醍醐灌顶!话说老师您真活跃,经常看到您的身影呢!
赵4老师 2018-08-27
  • 打赏
  • 举报
回复
不要迷信书、考题、老师、回帖;
要迷信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

图灵狗 2018-08-24
  • 打赏
  • 举报
回复

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 | 我的程序 测试了也一样。求助,想判断输入的结尾。
六道佩恩 2018-08-24
  • 打赏
  • 举报
回复
引用 2 楼 sghcpt 的回复:
楼主,能不能先把你截图的图片保存到文件中,然后再调用fgetc读取文件流,看看是否也有负数出现,如果是,那么应该就是图片中数据涉及到使用负数表示的值了。。那么就想其它办法解决了。。
“想判断输入的结尾”至于判断结尾,如果上面都不好判断,那么还是把数据保存到文件,判断读取文件是否结束比较好处理点。

这个方法肯定可以,二进制文件都差不多,只是fgetc读文件的取的每个字节是0-255,所以能正常用EOF判断结尾,但直接输入的方式可以为负数,这样EOF就没有了意义。方法是可以,就是效率太低了。
六道佩恩 2018-08-24
  • 打赏
  • 举报
回复
引用 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来判断结尾呢?
六道佩恩 2018-08-24
  • 打赏
  • 举报
回复
引用 1 楼 Slzde_sub 的回复:


应该是signed char 和 unsigned char的关系 你可以尝试转换一下,,我没用过这个函数 不太清楚

不可能的,用unsigned就不可能得到-1,也就是得不到EOF
赵4老师 2018-08-24
  • 打赏
  • 举报
回复
int c;
unsigned char uc;
whie (1) {
c=fgetc(stdin);
if (EOF==c) break;
uc=(unsigned char)c;
printf("0x%02X ",uc);
}
六道佩恩 2018-08-24
  • 打赏
  • 举报
回复
引用 10 楼 turingo 的回复:
看我7楼的回复,要按照16位或者32位来理解-1,一个字节0xff是255而不要理解为-1。

[quote=引用 9 楼 weixin_39158150 的回复:]
[quote=引用 8 楼 zhangchm2018 的回复:]
连续读取到与图片大小相同数量的-1,作为结尾。
也就是读取两张图片,一张是原图,一张是全是-1的图。

如果事先知道图片有多大的话,那我直接获取图片大小的数据就行了,何必再获取多一倍的数据来判断[/quote][/quote]
fgetc(stdin)从标准输入读取,-1可太多了,如果是白色图片,基本上全是-1,范围都只要-127 - 128,没有255
sghcpt 2018-08-24
  • 打赏
  • 举报
回复
楼主,能不能先把你截图的图片保存到文件中,然后再调用fgetc读取文件流,看看是否也有负数出现,如果是,那么应该就是图片中数据涉及到使用负数表示的值了。。那么就想其它办法解决了。。
“想判断输入的结尾”至于判断结尾,如果上面都不好判断,那么还是把数据保存到文件,判断读取文件是否结束比较好处理点。
图灵狗 2018-08-24
  • 打赏
  • 举报
回复
看我7楼的回复,要按照16位或者32位来理解-1,一个字节0xff是255而不要理解为-1。

引用 9 楼 weixin_39158150 的回复:
[quote=引用 8 楼 zhangchm2018 的回复:]
连续读取到与图片大小相同数量的-1,作为结尾。
也就是读取两张图片,一张是原图,一张是全是-1的图。

如果事先知道图片有多大的话,那我直接获取图片大小的数据就行了,何必再获取多一倍的数据来判断[/quote]
六道佩恩 2018-08-24
  • 打赏
  • 举报
回复
引用 8 楼 zhangchm2018 的回复:
连续读取到与图片大小相同数量的-1,作为结尾。
也就是读取两张图片,一张是原图,一张是全是-1的图。

如果事先知道图片有多大的话,那我直接获取图片大小的数据就行了,何必再获取多一倍的数据来判断
zhangchm2018 2018-08-24
  • 打赏
  • 举报
回复
连续读取到与图片大小相同数量的-1,作为结尾。
也就是读取两张图片,一张是原图,一张是全是-1的图。

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧