查找文本文件中每行的行大小

如何计算每行中的字符数或数字? 是否有类似EOF的东西更像是一条线?

您可以遍历行中的每个字符并继续递增计数器,直到遇到行尾( '\n' )。 确保以文本模式( "r" )而不是二进制模式( "rb" )打开文件。 否则,流不会自动将不同平台的行结束序列转换为'\n'字符。

这是一个例子:

 int charcount( FILE *const fin ) { int c, count; count = 0; for( ;; ) { c = fgetc( fin ); if( c == EOF || c == '\n' ) break; ++count; } return count; } 

这是一个测试上述function的示例程序:

 #include  int main( int argc, char **argv ) { FILE *fin; fin = fopen( "test.txt", "r" ); if( fin == NULL ) return 1; printf( "Character count: %d.\n", charcount( fin ) ); fclose( fin ); return 0; } 

关于逐行读取文件,请查看fgets 。

 char *fgets(char *restrict s, int n, FILE *restrict stream); 

fgets()函数必须从流中读取字节到s指向的数组,直到读取n-1个字节,或者读取a并将其传送到s,或者遇到文件结束条件。 然后以空字节终止该字符串。

这里唯一的问题可能是您无法保证文件中的最大行大小。 如果是这种情况,您可以迭代字符,直到看到换行符。

关于行尾:

简短回答: \n是换行符(也称为换行符)。

维基百科的答案很长:

基于ASCII或兼容字符集的系统分别使用LF(换行,0x0A,十进制10)或CR(回车,0x0D,十进制13)或CR后跟LF(CR + LF,0x0D 0x0A); 请参阅下面的CR + LF惯例的历史原因。 这些字符基于打印机命令:换行符表示一行纸张应从打印机送出,并且回车符指示打印机托架应返回到当前行的开头。

 * LF: Multics, Unix and Unix-like systems (GNU/Linux, AIX, Xenix, Mac OS X, FreeBSD, etc.), BeOS, Amiga, RISC OS, and others * CR+LF: DEC RT-11 and most other early non-Unix, non-IBM OSes, CP/M, MP/M, DOS, OS/2, Microsoft Windows, Symbian OS * CR: Commodore 8-bit machines, Apple II family, Mac OS up to version 9 and OS-9 

但由于您不太可能使用仅使用回车的表示,因此寻找换行应该没问题。

\n是C中的换行符。在其他语言中,例如C#,您可以使用类似C#的Environment.EndLine来克服平台难题。

如果您已经知道您的字符串是一行(让我们称之为行),请使用strlen(line)来获取其中的字符数。 如果以'\n'结尾,则减去1。

如果字符串中包含新行字符,则需要将其拆分为新行字符,然后在每个子字符串上调用strlen()

如果以文本模式打开文件,即fopen()的第二个参数中没有b ,则可以逐个读取字符,直到找到'\n'来确定行大小。 底层系统应该注意将行尾终止符转换为只有一个字符'\n' 。 在某些系统上,文本文件的最后一行可能不以'\n'结尾,因此这是一种特殊情况。

伪代码:

 count := 0 c := next() while c != EOF and c != '\n'" count := count + 1 

以上将计算给定行中的字符数。 next()是一个从文件中返回下一个字符的函数。

或者,您可以将fgets()与缓冲区一起使用:

 char buf[SIZE]; count = 0; while (fgets(buf, sizeof buf, fp) != NULL) { /* see if the string represented by buf has a '\n' in it, if yes, add the index of that '\n' to count, and that's the number of characters on that line, which you can return to the caller. If not, add sizeof buf - 1 to count */ } /* If count is non-zero here, the last line ended without a newline */