用于计算txt文件中的行的C函数

时间:2015-12-28 15:24:31

标签: c

我在文件中有一个矩阵,我想计算行数和列数。 矩阵元素由空格分隔:

1 2.3 4 5 ..etc
3 4 6.77 9
8 .....
........
etc

我找到了一个计算列数的函数..它就像魅力一样:

int getColumn(FILE* fp)
  {
    char buff[BUFSIZ]={0};
    int count=0;
    char *p;

    if(NULL==fgets(buff, BUFSIZ, fp))
        return -1;
    rewind(fp);
    for(p=buff;NULL!=strtok(p, " \t\n");p=NULL)
        ++count;
    return count;
}

现在我想创建一个类似的函数getRow()来计算行...但我真的不明白getColumn()是如何工作的 我有一些替代getRow(),但我读到它与EOF玩不太安全..(事实上我遇到了问题) 例如:

int getRow(FILE* fp)
{                                
  int ch=0;
  int count=1;

while(!feof(fp))
   {
      ch = fgetc(fp);
      if(ch == '\n')
      count++;
   }
  return count;
}

2 个答案:

答案 0 :(得分:4)

计算C

中文本文件中的行

我会尝试解释它是如何工作的。首先,你必须了解函数getColumn是什么。

简答:它会读取输入文件的第一行(如果有),并返回由以下其中一项分隔的项目数:space,tab或newline。

长答案:首先检查是否有要阅读的内容:

if(NULL == fgets(buff, BUFSIZ, fp))
    return -1;

函数 fgets 从文件中获取一行,这意味着它在换行符上停止(或者如果指定的大小小于行的实际大小)。在上面的示例中, fgets 尝试从 fp 指向的文件中读取 BUFFSIZ - 1 字符,并将它们存储在字符数组buff中( -1,因为保留换行符)。但是,如果没有要阅读的字符, fgets 会返回 NULL 并退出该功能。

另一方面,如果返回值不是 NULL ,则该行存储在数组buff中。这里的假设是该线符合 BUFSIZ

BTW BUFSIZ 是GNU C库中定义的宏,如下所示:

  

宏:int BUFSIZ此宏的值是一个整数常量   表达式,适用于setvbuf的size参数。这个   值保证至少为256(link)。

然后在循环中检查数组buff:

for(p=buff; NULL!=strtok(p, " \t\n"); p=NULL)
    ++count;

for循环通过函数 strtok 在数组buff上循环。 strtok “用于隔离以null结尾的字符串中的顺序令牌”, strtok 将检查buff直到终止字符'\ 0',但是,任何时候遇到其中一个指定的分隔符“ \ t \ n ”,它将返回指向项目的指针,输入循环并增加计数。在第一次调用时,必须使用指针调用 strtok ,但每次后续调用 strtok 必须使用 NULL ,这就是为什么 p 在for循环的第三个表达式中设置为 NULL

如何阅读和计算

#define BUFFSIZE 1024
int countlines (FILE *fin)
{
    int  nlines  = 0;
    char line[BUFFSIZE];

    while(fgets(line, BUFFSIZE, fin) != NULL) {
        nlines++;
    }

    return nlines;
}

我们再次阅读 BUFFSIZE - 1 字符,但我更喜欢手动设置BUFFSIZE。

最后备注

计算行和列的正确方法是仅使用一个函数。在读取每一行时,您可以计算列数。如果您确定输入文件是正确的(并且所有行具有相同的列数),则可以仅在第一行上对列进行计数,或者可以为每行计算它们。

答案 1 :(得分:-1)

尝试:

while(ch != EOF)
{
     // Code goes in here
}

而不是feof()