0

我有这个 C 代码:

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设法使用它来读取一个字符。

这里有什么问题?

4

3 回答 3

2

fopen并且read是不同家庭的功能。这些家庭是:

  • fopenwith fread(and also getc), 来自 C 标准库。

  • openread, 来自 POSIX 规范。

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

在您的情况下,用于fread从文件中读取。

于 2016-04-23T08:47:11.547 回答
1

而不是read(fd, &buffer, 10)
你想使用:fread(buffer, 1, 10, fd)

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

于 2016-04-23T08:55:37.253 回答
0

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

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

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) 读入缓冲区。

于 2016-04-23T08:47:44.297 回答