我在文件中有一个矩阵,我想计算行数和列数。 矩阵元素由空格分隔:
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;
}
答案 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()
。