【问题标题】:How to traverse C loop correctly using File Pointer only如何仅使用文件指针正确遍历 C 循环
【发布时间】:2016-01-22 16:01:56
【问题描述】:

我正在用 c 编写一个程序,它逐行读取并对每一行的元素进行一些操作。我这样调用我的 read_row 函数。

while(filePointer!=NULL)
{
        int result=readRow(filePointer,headerRow,lineRow);
        printf("The value of  row is |%d|\n",result);
}

在我的 read_row 函数中,我使用 get c 遍历该行。

 cc=getc(fp);
    while((cc!='\n') && (cc!= EOF))
    {

            *line=cc;
            line++;  
            if(cc==',')
            {
                counterr++;
            }
            cc=getc(fp);

    }  

    if(cc==EOF)
    {
        fp=NULL;
    }

我正在尝试遍历所有行。然而,这个循环是无限的,因为文件指针永远不会变为空。如果 cc 等于 EOF,我试图将文件指针设置为 null。然而,这根本没有帮助。因此,请解释我应该如何正确终止该循环。我相信 '\n' 在 EOF 之前出现。因此,文件指针不会变为 null。我必须使用文件指针来完成它,因为我已经基于该逻辑制作了一个非常大的程序。此外,我只能找到使用 fgets() 等方法进行遍历的示例。

【问题讨论】:

  • 显示函数定义。
  • 如果你的逻辑是基于当filePointerNULL时结束,你怎么去fclose呢?
  • 函数定义需要FILE *。我什至没有考虑 fclose()。有没有更好的方法来解决这个问题?我可以创建另一个文件指针副本并调用 fgets。两者都对应同一个文件,两者都会前者能够终止后者。
  • 如果你的系统有getline(3)
  • filepointer 是变量的名称,直到现在,由于在 C 中读取某些内容,变量没有机会更改值,除了读取值所在的目标存储完毕。也许您正试图想象在其他语言中也能像这样工作的东西?

标签: c file loops pointers while-loop


【解决方案1】:

当您将指针传递给函数然后更改它时,您实际上是在更改该指针的副本,而不是指针本身。您需要传递一个指向指针的指针才能使其工作,这是一个小例子:

int a = 2;
int b = 5;

//note the pointer to pointer:
void foo(int **ptr)
{
    *ptr = &b;
}

int main() {
    int * ptr = &a;
    foo(&ptr);
    printf("%d", *ptr); // prints 5
}

所以在你的情况下readRow 应该接受FILE**,你应该把它称为readRow(&filePointer...

【讨论】:

  • 我就是这么想的。
【解决方案2】:

发布的代码有几个重大错误。

例如设置参数`FILE* fp = NULL;只是改变实际 fp 的副本,而不是调用函数中的 fp。

FILE * fp参数改成FILE **fp后对函数的调用修改为匹配:

在修改 fp 之前,将该参数传递给fclose(*fp),否则文件仍然打开但指向关联文件描述符的指针被破坏,因此无法关闭文件。

【讨论】:

    【解决方案3】:

    你可以用这个功能试试:

    fscanf(fp,"%s\n",out_buffer)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-20
      • 2021-07-28
      • 2015-08-12
      • 2013-12-12
      相关资源
      最近更新 更多