【问题标题】:How can I seek in a buffer? C如何在缓冲区中寻找? C
【发布时间】:2011-02-13 05:24:10
【问题描述】:

我有一个缓冲区,它是从文件中读取的文本。我像这样循环遍历它以计算行数:

    while(fgets(buf, 1024, fp) != NULL){

        for(counter = strtok(buf,"\n"); counter; counter=strtok(0,"\n")){               
            threads++;
        }  
    }

    printf("NUMBER OF THREADS: %i", threads);

然后我再次循环它以解析每一行并使用该行中解析的参数启动一个线程。

但是,当我运行它时,它会退出,因为下一行是:

while(fgets(buf, 1024, fp) != NULL){
 ....
}

我想这是因为 fgets 正在查看缓冲区的末尾。

我可以回到缓冲区的开头吗?

【问题讨论】:

    标签: c string parsing


    【解决方案1】:

    使用rewind(fp);fseek(fp, 0, SEEK_SET);

    fseek 被认为是更好的做法,因为它返回状态代码。

    【讨论】:

      【解决方案2】:

      首先,你不应该使用strtok,因为它不能被交错,即使没有线程,你只是在自找麻烦。听起来您正在某处增加缓冲区变量。只需保留原始缓冲区变量并修改副本,然后您就应该是黄金了。

      【讨论】:

      • 对不起,我不熟悉“交错”这个词——你是什么意思?我使用 strtok 只是为了分解这些行,然后我用 sscanf 解析它们并将它们传递给各个线程。
      • 你认为我可能会遇到问题?这是事情的一般流程:我创建 4 个缓冲区,解析 URL,并将它们传递给一个线程——然后在那个线程中,我做的第一件事就是为这些字符串分配内存并将它们保存在函数中。
      • 交错意味着先做一件事然后再做另一件事。是的,您仍然可能会遇到问题,因为 strtok 修改了一个全局变量以保持其状态。它天生就是线程敌对的。有一个名为“strtok_r”的线程安全替代方案,但最好完全避免这种野兽,恕我直言。
      【解决方案3】:

      保留另一个仅指向缓冲区开头的指针(char * begin 可能?),然后在第一个 while 循环后重新初始化 fp。这将有效地“寻找”回到起点。

      【讨论】:

        【解决方案4】:

        注意fgets() 一次读取一行,所以它返回的字符串中最多有一个换行符。

        请注意,strtok() 会修改它扫描的字符串,将 NUL 字符放入每个标记末尾的原始字符串中。

        其中一个或两个都可能影响您的逻辑。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-06-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多