有没有一种使用C语言计算文件行数的方法?
如果您想以编程方式执行此操作,请在文本模式下打开文件,并执行fgetc()操作,直到达到文件结尾。保持调用fgetc的次数计数。
FILE *fp = fopen("myfile.txt");
int ch;
int count=0;
do
{
ch = fgetc(fp);
if(ch == '\n') count++;
} while( ch != EOF );
printf("Total number of lines %d\n",count);
char
可能是无符号的,EOF
可能是 -256。 - aazwc
命令。大多数Linux发行版都包含它。一个经常困扰的问题是,无论你使用哪种方法,文件是否包含符合 POSIX 标准的 '\n'
在最后一行都会影响返回的行数。有许多编辑器(和程序)可以愉快地将最终文本写入文件而不添加 POSIX 行尾标识符。无论你使用哪种方法确定文件中的行数,都可以处理这两种情况。
如果你想确定一个大文件的行数,那么你肯定需要使用缓冲读取(例如每次读取多个字符到缓冲区)而不是逐个字符读取。这可以极大地提高效率。
将这两个部分结合起来,你可以使用 fgets
或 POSIX 的 getline
相当有效地确定文件中的行数。例如,使用 getline
(它处理了行尾问题),你可以这样做:
/** open and read each line in 'fn' returning the number of lines */
size_t nlinesgl (char *fn)
{
if (!fn) return 0;
size_t lines = 0, n = 0;
char *buf = NULL;
FILE *fp = fopen (fn, "r");
if (!fp) return 0;
while (getline (&buf, &n, fp) != -1) lines++;
fclose (fp);
free (buf);
return lines;
}
使用fgets
函数,在最后一个换行符之后测试是否还有其他文本,这取决于你的代码,例如:
/** note; when reading with fgets, you must allow multiple reads until
* '\n' is encountered, but you must protect against a non-POSIX line
* end with no '\n' or your count will be short by 1-line. the 'noeol'
* flag accounts for text without a '\n' as the last line in the file.
*/
size_t nlines (char *fn)
{
if (!fn) return 0;
size_t n = 0, noeol = 0;
char buf[FILENAME_MAX] = "";
FILE *fp = fopen (fn, "r");
if (!fp) return 0;
while (fgets (buf, FILENAME_MAX, fp)) {
noeol = 0;
if (!strchr (buf, '\n')) {
noeol = 1; /* noeol flag for last line */
continue;
}
n++;
}
if (noeol) n++; /* check if noeol, add 1 */
fclose (fp);
return n;
}
(注意:您可以在每个函数中添加自己的代码来处理fopen
失败。)
打开文件进行读取,可以使用fopen()函数;
逐行读取文件内容,可以使用fread()函数;
增加一个之前初始化为零的行计数器;
当从文件的下一次读取返回文件结束时,您就完成了。使用printf()函数输出行计数器。