【问题标题】:getline startovergetline 重新开始
【发布时间】:2013-01-12 08:54:03
【问题描述】:

我正在使用 C 中的 get line 函数来读取文件的行。我想循环遍历该函数,以便可以多次读取文件。但由于某种原因,它只在后续循环开始时读取一次(我认为某处仍有指针指向最后一行)。如何让它重置?

为了让事情更清楚,如果文件中有 100 行,下面的最大 val 将是 100,即使它应该达到 300。

谢谢!

FILE* fp = myfopen (inf, "r");
char* line = NULL;
size_t len = 0;

int num=3
int val=0

for (i=0;i<num;i++)
{
    while (getline (&line, &len, fp) != -1)
    {  
        val++;   
    }
}

【问题讨论】:

    标签: c for-loop getline


    【解决方案1】:

    一旦你读到文件末尾,你必须调用

    rewind(fp);
    

    再次从流的开头开始。

    【讨论】:

    • ftell 以获得更多控制...但rewind 更清晰。
    【解决方案2】:

    如前所述,您可以使用rewind() 函数重新开始,另一种选择当然是将文件的打开/关闭移动到循环中:

    FILE* fp; = myfopen (inf, "r");
    
    for (i=0;i<num;i++)
    {
        fp = myfopen(inf, "r");
        while (getline (&line, &len, fp) != -1)
        {  
            val++;   
        }
        fclose(fp);
    }
    

    【讨论】:

    • 反复打开和关闭文件会导致内核中一堆不必要的搅动(即使缓存了很多数据结构,它仍然是系统调用)。
    • @Michael - 没有说这是一个好的解决方案,只是说这是另一个解决方案。根据应用程序,更好的是读取整个文件,然后根据需要从局部变量中操作数据
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-11
    相关资源
    最近更新 更多