如何计算每行中的字符数或数字?有没有类似EOF的东西,更像是一个终结线?
答案 0 :(得分:5)
您可以遍历行中的每个字符并继续递增计数器,直到遇到行尾('\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;
}
以下是测试上述功能的示例程序:
#include <stdio.h>
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;
}
答案 1 :(得分:2)
关于逐行阅读文件,请查看fgets。
char *fgets(char *restrict s, int n, FILE *restrict stream);
fgets()函数应读取字节 从流到指向的数组 用s,直到读取n-1个字节,或者a 被阅读并转移到 s,或文件结束条件是 遇到。然后是字符串 以空字节结束。
此处唯一的问题可能是您无法保证文件中的最大行大小。如果是这种情况,您可以迭代字符,直到看到换行符。
关于行尾:
简短回答:\n
是换行符(也称为换行符)。
来自维基百科的答案很长:
基于ASCII或兼容的系统 字符集使用LF(Line feed,0x0A,十进制10)或CR (回车,0x0D,十进制13) 单独或CR后跟LF (CR + LF,0x0D 0x0A);见下文 CR + LF的历史原因 惯例。这些字符是基于 在打印机命令上:换行 表示一行纸 应该从打印机输出,并且a 回车表明了 打印机运输应该返回到 当前行的开头。
* 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
但是,由于您不太可能使用仅使用回车的表示,因此寻找换行应该没问题。
答案 2 :(得分:1)
\n
是C中的换行符。在其他语言中,例如C#,您可以使用类似C#的Environment.EndLine
来克服平台难题。
如果您已经知道您的字符串是一行(让我们称之为行),请使用strlen(line)
来获取其中的字符数。如果以'\n'
结束,则减去1。
如果字符串中包含换行符,则需要将其拆分为新行字符,然后在每个子字符串上调用strlen()
。
答案 3 :(得分:1)
如果您以文本模式打开文件,即在b
的第二个参数中没有fopen()
,则可以逐个读取字符,直至找到'\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 */
答案 4 :(得分:0)
最初的问题是如何获取“每一行”(给定一行?还是当前行?)中的字符数,而答案大多给出了如何确定文件中第一行长度的解决方案。可以很容易地应用其中的一些来确定当前行的长度(无需事先猜测缓冲区的最大长度)。
但是,实践中通常需要的是文件中的任何行的最大长度。然后可以保留一个缓冲区,并使用fgets逐行读取文件,并使用一些不错的函数(strtok,strtod等)来解析行。在实践中,您可以使用任何先前的解决方案来确定一行的长度,而只需扫描所有行并取其最大值即可。
一个简单的脚本,可以逐个字符读取文件:
max=0; i=0;
do
if ((c=fgetc(f))!= EOF && c!='\n') i++;
else {
if (i>max) max=i;
i=0;
}
while (c!=EOF);
return max;
注意:在实践中,只要有最大长度的上限就足够了。肮脏的解决方案是将文件大小用作最大行长度的上限。