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

时间:2010-01-26 02:20:57

标签: c

如何计算每行中的字符数或数字?有没有类似EOF的东西,更像是一个终结线?

5 个答案:

答案 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;

注意:在实践中,只要有最大长度的上限就足够了。肮脏的解决方案是将文件大小用作最大行长度的上限。