C - feof 和 fseek 替换/等效代码?

C - feof and fseek replacement/equivalent code?

提问人:Adiel 提问时间:4/30/2014 更新时间:4/30/2014 访问量:2137

问:

我一直在我的代码中使用上述函数,现在发现我们不允许这样做。 也许有人可以帮助实现替代功能? 我只允许使用 Fgets,fgetc,fputc,fprintf,sprintf,fscanf,sscanf,rewind,stdin,stdout....

关于fseek 我有一个大致的想法,关于获取我需要跳到内部字符串中的字符 这是正确的想法吗?

如果有人能帮忙,我会很高兴。 多谢!

C Fseek Feof

评论

2赞 Jonathan Leffler 4/30/2014
谁说你不被允许使用?除非您使用文件描述符函数而不是文件流函数,否则没有合理的完整替代方案。你很少需要使用 — 参见 while (!feof(file)) is always wrong for more information about that.你需要去哪里寻找?如果它回到起点,那就有效了。如果它是你读过的地方,那么就可以使用了。fseek()feof()rewind()fgetpos()fsetpos()
0赞 chux - Reinstate Monica 4/30/2014
似乎很奇怪,但允许.fseek()rewind()
0赞 Adiel 4/30/2014
我的课程讲师\教授不允许我使用它:-)既不是 fgetpos 也不是 fsetpos..感谢你们所有人,我已经想通了。查看我对蒂莫西·琼斯(Timothy Jones)的评论:)

答:

1赞 Sjoerd 4/30/2014 #1

显然,您只能从 stdin 读取,它不支持查找,但支持文件末尾。

  • 要跳过字符,只需使用 fread 将它们读入缓冲区,然后忽略缓冲区中的结果。
  • 要检测文件末尾,请检查 fread 的返回值。如果 fread 返回 0,则没有更多内容可读取(或发生错误)。

评论

0赞 Adiel 4/30/2014
谢谢,但我现在可以使用面包:|谢谢大家,我已经想通了。查看我对蒂莫西·琼斯(Timothy Jones)的评论:)
1赞 Timothy Jones 4/30/2014 #2

我认为这些功能是被禁止的,因为某些分配限制,而不是技术?这取决于你想做什么:

  • feof()用于确定流是否位于文件末尾
  • fseek()用于移动到该文件中的特定位置。

您可以确定流在读取时是否位于文件末尾。例如,在手册页中:fscanf

如果在发生任何转换(如文件结束)之前发生输入失败,则返回该值。EOF

要在不使用 的情况下在文件中移动,可以使用允许列表中的 。 从手册页:fseek()rewind()rewind()

rewind() 函数将流指向的流的文件位置指示器设置为文件的开头。它相当于:

       (void)fseek(stream, 0L, SEEK_SET)

从那里开始,你必须读到你想读的点。seek()

评论

0赞 Adiel 4/30/2014
嘿,由于分配限制,我不允许。
0赞 Timothy Jones 4/30/2014
还行。我的建议有帮助吗,还是你仍然卡住了?
0赞 Adiel 4/30/2014
我很抱歉从我的手机上发布的简短评论。如前所述,由于分配限制,我不允许使用这些功能。根据你们所有人的评论,有点认为我管理了一个解决方法。替换后,我使用了一个 int 标志 - end_of_file = fscan(...) 并在之后检查了有关 fseek 的标志,我需要在流中前进而不是后退,所以我使用了 fscanf(file, “%*[^\n]%*c”) 并且它工作完美,并将位置指示器移动到下一行的开头,而不会“收集”不需要的文本。谢谢大家,祝大家度过愉快的一周\周末:)