在C中逐行阅读

时间:2014-06-10 11:34:10

标签: c file io

目前在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循环的下一次迭代中读取该行的其余部分?

如何在没有最大长度的情况下逐行阅读?

2 个答案:

答案 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}}内存。