目前在C中逐行读取文件我正在使用:
char buffer[1024];
while(fgets(buffer, sizeof(buffer), file) != NULL) {
//do something with each line that is now stored in buffer
}
但是文件中无法保证该行短于1024.如果一行超过1024,会发生什么?是否会在while循环的下一次迭代中读取该行的其余部分?
如何在没有最大长度的情况下逐行阅读?
答案 0 :(得分:4)
是的,在下一次迭代中将读取该行的其余部分。
您可以通过检查字符串的最后一个字符(即空终止符之前的字符)来检测是否读取整行,以查看它是否为'\n'
- fgets传递{{1通过你。
没有标准C函数可以读取一行,同时为它动态分配足够的内存,但是有一个POSIX函数'\n'
可以做到这一点。当然,您可以编写自己的getline()
或以其他方式进行阅读,并在fgets
的循环中进行阅读。
答案 1 :(得分:0)
根据标准§7.19.7.2,
char *fgets(char * restrict s, int n, FILE * restrict stream);
fgets函数最多读取的数量少于1 由n 指定的字符从流指向的流中传入 s指向的数组。 a后没有读取其他字符 换行符(保留)或文件结束后。空 在读入最后一个字符后立即写入字符 数组。
来自MSDN,
fgets
从当前流位置读取字符并包括第一个换行符,到流的末尾,或直到读取的字符数等于n - 1,以先到者为准即可。换行符如果被读取,则包含在字符串中。
因此,如果fgets
未遇到sizeof(buffer)-1
范围内的换行符,则malloc
将读取下一次迭代中的其余行。
如果您想一次性阅读整行,那么最好与realloc
一起使用,如果需要,可以根据需要{{1}}内存。