首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >reports坏文件描述符尽管getc成功地使用相同的fd读取字符

reports坏文件描述符尽管getc成功地使用相同的fd读取字符
EN

Stack Overflow用户
提问于 2016-04-23 08:27:17
回答 3查看 442关注 0票数 0

我有一个C代码:

代码语言:javascript
复制
FILE * fd = fopen(filename,"rb");
printf("%c ",(char)getc(fd)); // returns expected char
unsigned char buffer[10];
printf("%d ",read(fd, &buffer, 10)); // -1
printf("%d\n",errno); // 9

getc像预期的那样从输入文件中返回一个字符。然而,read返回一个错误(-1),errno被设置为9(坏的文件描述符)。显然,文件描述符是可以的,因为getc设法使用它读取字符。

这里有什么问题?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-04-23 08:47:11

fopenread是不同家族的函数。这些家庭是:

  • fopenfread (也包括getc),来自C标准库。
  • openread,来自POSIX规范。

第一个家族使用文件指针作为FILE*类型,而第二个家族使用文件描述符作为int类型。只要不将一种文件描述符类型转换为另一种文件描述符类型,就不能将这两个家族混合在一起。从FILE*int的转换是用POSIX函数fileno完成的。

在您的例子中,使用fread从文件中读取。

票数 2
EN

Stack Overflow用户

发布于 2016-04-23 08:55:37

而不是read(fd, &buffer, 10)

您想要使用:fread(buffer, 1, 10, fd)

FILE*不是文件描述符,而是流;这就是为什么必须使用fread() (需要流)而不是read() (需要文件描述符)。此外,应该使用buffer而不是&buffer (这将导致UB)。

票数 1
EN

Stack Overflow用户

发布于 2016-04-23 08:47:44

这是奇怪的密码。您想打印read的返回代码,而不是读取的数据?

首先修复您的读,您需要fread而不是read:

代码语言:javascript
复制
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *" stream );

造成崩溃的原因是您覆盖了缓冲区的地址,而不是写入缓冲区本身。

因此,printf("%d ",read(fd, &buffer, 10));应该是printf("%d ",fread(buffer, 1, 10, fd));,将10 (nmemb=10)字节(size=1)读入缓冲区。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36808463

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档