我有一个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); // 9getc像预期的那样从输入文件中返回一个字符。然而,read返回一个错误(-1),errno被设置为9(坏的文件描述符)。显然,文件描述符是可以的,因为getc设法使用它读取字符。
这里有什么问题?
发布于 2016-04-23 08:47:11
fopen和read是不同家族的函数。这些家庭是:
fopen与fread (也包括getc),来自C标准库。open与read,来自POSIX规范。第一个家族使用文件指针作为FILE*类型,而第二个家族使用文件描述符作为int类型。只要不将一种文件描述符类型转换为另一种文件描述符类型,就不能将这两个家族混合在一起。从FILE*到int的转换是用POSIX函数fileno完成的。
在您的例子中,使用fread从文件中读取。
发布于 2016-04-23 08:55:37
而不是read(fd, &buffer, 10)
您想要使用:fread(buffer, 1, 10, fd)
FILE*不是文件描述符,而是流;这就是为什么必须使用fread() (需要流)而不是read() (需要文件描述符)。此外,应该使用buffer而不是&buffer (这将导致UB)。
发布于 2016-04-23 08:47:44
这是奇怪的密码。您想打印read的返回代码,而不是读取的数据?
首先修复您的读,您需要fread而不是read:
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)读入缓冲区。
https://stackoverflow.com/questions/36808463
复制相似问题