【发布时间】:2017-07-05 15:57:18
【问题描述】:
这是程序:
#include <stdio.h>
#define BUF_LEN 200
#define LINE_NUMBER 3
int line_len(char* filename, int n)
{
FILE* f;
char buf[BUF_LEN];
int j, i = 0;
if ((f = fopen(filename, "r")))
{
for (j = 0; j < n; j++)
fgets(buf, BUF_LEN, f);
for (i = 0; buf[i]; i++) /* find end of buf */ ;
fclose(f);
}
return i;
}
int main()
{
printf("%d\n", line_len("test.txt", LINE_NUMBER));
return 0;
}
据我了解,函数line_len接收文件名和我们感兴趣的行数。然后它以只读模式打开文件并迭代直到到达n行,通过每次迭代从文件f 中读取BUF_LEN-1 字符并将这些字符存储在buf 中。因此,当第一个 for 循环中断时,buf 将包含第一个 n 行的所有字符。
我不明白需要第二个循环。它什么时候终止?
这个功能是如何工作的?如果在第一个 for 循环的末尾 buf 将包含前 n 行的字符,那么这个函数怎么会返回行 n 的长度?
提前致谢!
【问题讨论】:
-
你忘了写几行代码吗?
-
代码确实有效,对吧?
-
第一个
for循环将第n行的每个字符添加到buf数组中。第二个for循环计算 buf 数组 (i) 的长度并返回。 -
在第二个循环中,buf 有 n-esime (LINE_NUMBER-esime) 行,这个循环将在 'i' 中计算它有多少个字符。请记住,每个字符串的结尾都在 \0 中。这是一种 0。所以,当 buf[i] 为 \0 时(你的字符串结束并且 'i' 已经有多少个字符),第二个循环停止。
-
@Tree
fgets是用buf调用的,这里和&buf[0]一样,是数组buf的第一个 元素的地址。因此,实质上,您告诉fgets将读取的行从第一个位置开始存储到buf。这会导致覆盖数组中以前的数据。
标签: c function file line fclose