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

如何让fgets读取时不遇\n即停止?实现文件固定长度字符读取

如何读取文件中前N个包含换行符的char字符

直接用fread()函数就能解决这个问题——它会严格按照你指定的字节数读取文件内容,不会因为遇到换行符\n而提前停止,完美适配你需要读取固定长度字符(含换行)的需求。

示例代码

#include <stdio.h>
#include <stdlib.h>

int main() {
    // 以二进制模式打开文件,避免系统自动转换换行符导致读取字节数偏差
    FILE *fp = fopen("your_file.txt", "rb");
    if (fp == NULL) {
        perror("文件打开失败");
        return EXIT_FAILURE;
    }

    const int N = 15; // 你需要读取的字符数量
    // 注意:如果要将读取内容作为字符串使用,buffer长度要设为N+1,留位置放终止符
    char buffer[N + 1];

    // fread参数:目标缓冲区、单个元素大小、元素数量、文件指针
    size_t read_count = fread(buffer, sizeof(char), N, fp);

    // 处理读取结果
    if (read_count == 0) {
        if (feof(fp)) {
            printf("已读取到文件末尾,无更多内容\n");
        } else {
            perror("文件读取出错");
        }
    } else {
        // 手动添加字符串终止符,避免输出乱码
        buffer[read_count] = '\0';
        printf("读取到的内容:\n%s\n", buffer);
    }

    fclose(fp);
    return EXIT_SUCCESS;
}

关键注意事项

  • 二进制模式打开:Windows系统下,文本模式会自动把\n转换成\r\n,导致实际读取的字节数和预期不符,用rb模式可以避免这个问题。
  • 返回值判断:fread返回实际读取的字节数,如果文件剩余字符不足N个,返回值会小于N,需要根据feof()判断是到了文件末尾还是读取出错。
  • 字符串终止符:fread不会自动在缓冲区末尾添加\0,如果要把读取的内容当作C字符串使用,必须手动添加,否则会出现未定义行为。
  • 和fgets的核心区别:fgets是按行读取,最多读size-1个字符,遇到换行或EOF就停止;fread是按字节数读取,完全忽略内容中的换行符,只看你指定的读取长度。

内容的提问来源于stack exchange,提问作者Marlon Müller

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 08:52:35