【问题标题】:Using fseek resulting in my filepointer jumping towards EOF使用 fseek 导致我的文件指针跳向 EOF
【发布时间】:2016-06-30 18:37:03
【问题描述】:

我正在尝试从文件中读取一行并返回刚刚读取的行的开头:

FILE *fp = fopen("C:\\F2BJROP1.phn", "r+");
while(1){
    /**Data reading**/
    fscanf(fp, "%f", &temp1);
    if(feof(fp))
        break;
    if(isvoiced(temp1)==1){ /** isvoiced() has nothing to do with this fp. **/
        pos = ftell(fp);
        voicedIntervs[k++] = temp1;
        fscanf(fp, "%f", &temp1);
        voicedIntervs[k++] = temp1;
        fseek(fp, pos, SEEK_SET); /** Trying to go back to pos **/
    }
}

但是在 fseek 之后,我观察到 fp 跳向 EOF。我希望我的 fp 回到存储在 pos 中的位置。 在程序的任何地方都没有声明其他 fp。

我知道 fp 达到 EOF,因为我调试并看到了值。

我使用的是 Windows 10。

【问题讨论】:

  • 与使用feof 相比,测试fscanf 的返回值(成功读取的项目数)会更好。你也没有检查下一次使用fscanf...不好!
  • @Weather Vane :好的,但我的要求是 fseek 应该将文件指针重新定位到存储在变量 fp 中的位置
  • 我看到你刚刚编辑了你的代码。所以这不是你的代码。请张贴Minimal, Complete, and Verifiable example,显示您已尝试过的内容。
  • 没有minimal reproducible example,我们无法提供帮助。你的举动。
  • 请添加打开文件的行(对 fopen 的调用),并说明您的操作系统。

标签: c file eof fseek ftell


【解决方案1】:

您是否使用附加模式(aa+)打开文件,如下面的代码所示?

fopen(fp, "a")`

Documentation 声明附加模式不接受重新定位:

追加:在文件末尾打开文件以进行输出。输出操作 总是在文件末尾写入数据,扩展它。重新定位 操作(fseek、fsetpos、rewind)被忽略。文件已创建 如果它不存在。

如果你这样做了,我建议你尝试使用读取 - r - 或读取/更新 - r+ - 模式打开它,如:

fopen(fp, "r")`

【讨论】:

  • 那么,它可能在第一个 fscanf 时到达EOF。也许添加一些printfs 或调试会有所帮助。
  • 我做到了。 ftell() 返回位置 -372,在下面的 fscanf() 之后,fp 位于 -368。但就在 fseek() 之后,fp 达到 2787。
  • 文件大吗?我的意思是让您使用printf 来查看fscanf 读取了多少以及读取了什么。行为是否正确? k 是否在 voicedIntervs 的边界内?
  • @AnandPA:确实应该将文件位置放回该值。但其他原因导致fseek 失败。也许这个问题对您的结果是不可见的,但它仍然导致 fseek 行为不端。我建议您仔细调试您的代码(通过打印或调试)并检查您正在制作的每个文件重新定位和读取。
  • 知道了。打开的文件是 UNIX 格式。我在 Notepad++ 中将其更改为 Windows 格式,更重要的是,将其扩展名重命名为 .txt。是的,我应该在 3 小时前完成。无论如何,谢谢!
猜你喜欢
  • 2011-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-19
  • 1970-01-01
  • 2012-07-23
  • 2018-01-23
相关资源
最近更新 更多