Jer*_*fin 19
通常你用C语言读取文件fgets.你也可以使用scanf("%[^\n]"),但很多人阅读代码可能会发现令人困惑和异国情调.
编辑:另一方面,如果你真的只想计算行数,那么这种scanf方法的略微修改版本可以很好地工作:
while (EOF != (scanf("%*[^\n]"), scanf("%*c")))
++lines;
Run Code Online (Sandbox Code Playgroud)
这样做的好处是,在每次转换中使用'*',scanf读取并匹配输入,但不对结果执行任何操作.这意味着我们不必在大缓冲区上浪费内存来保存我们不关心的行的内容(并且仍然有可能获得比这更大的行,所以我们的计数结果错了除非我们需要做更多工作来弄清楚我们读取的输入是否以换行符结束.
不幸的是,我们必须将scanf这两部分分解成两部分.scanf转换失败时停止扫描,如果输入包含空行(两个连续的换行符),我们预计第一次转换将失败.然而,即使失败了,我们也希望第二次转换发生,读取下一个换行符并继续下一行.因此,我们尝试第一次转换"吃"线的内容,然后进行%c转换以读取换行符(我们真正关心的部分).我们继续执行这两个操作,直到第二次调用scanf返回EOF(通常在文件的末尾,尽管在读取错误的情况下也会发生).
编辑2:当然,还有另一种可能性(至少可以说是)更简单易懂:
int ch;
while (EOF != (ch=getchar()))
if (ch=='\n')
++lines;
Run Code Online (Sandbox Code Playgroud)
有些人发现违反直觉的唯一部分是ch 必须将其定义为int,而不是char使代码正常工作.
这是一个基于fgetc()的解决方案,该解决方案适用于任何长度的行,并且不需要您分配缓冲区。
#include <stdio.h>
int main()
{
FILE *fp = stdin; /* or use fopen to open a file */
int c; /* Nb. int (not char) for the EOF */
unsigned long newline_count = 0;
/* count the newline characters */
while ( (c=fgetc(fp)) != EOF ) {
if ( c == '\n' )
newline_count++;
}
printf("%lu newline characters\n", newline_count);
return 0;
}
Run Code Online (Sandbox Code Playgroud)