C语言中如何使用read()函数从文件中读取数据?
二进制按块读取文件实现方案
原代码问题梳理
- 类型不匹配:
open()是POSIX系统调用,返回int类型的文件描述符,原代码错误用FILE*类型变量接收 - 缓冲区定义错误:
unsigned char * buffer[1024]为指针数组,无法存储二进制数据,应改为字符数组unsigned char buffer[1024] - 缺少二进制打开标记:跨平台场景下需添加
O_BINARY标记确保二进制读取 - 无异常校验:未校验文件打开、读取操作的返回值,无法处理异常场景
- 输出格式错误:
%s仅适用于\0结尾的字符串,不能用于输出单个二进制字节
修正后完整实现
以下代码实现二进制模式打开文件,每次读取指定大小的数据块,兼容类Unix与Windows平台:
#include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <unistd.h> // 自定义每次读取的数据块大小,可按需调整 #define BLOCK_SIZE 1024 int main(int argc, char* argv[]) { int fd; ssize_t actual_read; unsigned char buffer[BLOCK_SIZE]; // 二进制只读打开文件 fd = open("file_test.txt", O_RDONLY | O_BINARY); if (fd < 0) { perror("open failed"); return EXIT_FAILURE; } // 循环按块读取至文件结束 while ((actual_read = read(fd, buffer, BLOCK_SIZE)) > 0) { // 此处可添加读取到的块数据处理逻辑,示例为打印字节十六进制值 printf("读取到%zd字节数据:\n", actual_read); for (int i = 0; i < actual_read; i++) { printf("%02x ", buffer[i]); } printf("\n"); } if (actual_read < 0) { perror("read failed"); close(fd); return EXIT_FAILURE; } close(fd); return EXIT_SUCCESS; }
可选标准C库实现
如果需要更通用的跨平台实现,也可以使用标准C库的IO函数,二进制打开标记为rb:
FILE* fp = fopen("file_test.txt", "rb"); // 按块读取:fread(缓冲区, 单元素大小, 元素个数, 文件指针) size_t actual_read = fread(buffer, 1, BLOCK_SIZE, fp);
内容的提问来源于stack exchange,提问作者therealbappi
相关产品推荐
相关产品推荐

