如何让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
相关产品推荐
相关产品推荐

