如何计算每行中的字符数或数字? 是否有类似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 */
以上就是c/c++开发分享查找文本文件中每行的行大小相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/562696.html