You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 12:45:02