如何使用C从下往上读取行?

Ero*_*ğlu 14 c file-read

我需要从下到上读取文件中列出的数字.我怎么能用C做到这一点?

该文件如下:

4.32
5.32
1.234
0.123
9.3
6.56
8.77
Run Code Online (Sandbox Code Playgroud)

例如,我想阅读最后三个数字.他们必须是float类型.

8.77
6.56
9.3
Run Code Online (Sandbox Code Playgroud)

PS.:实际上我需要一个使用fseek等播放文件指针位置的解决方案.

zwo*_*wol 27

重要的是要了解没有现代操作系统跟踪文件中换行符的位置.(VMS可以,而且我非常肯定一些IBM大型机操作系统,但你可能不会使用其中的任何一种.)因此,不可能寻求线路边界.也不可能以相反的顺序逐字节读取.

因此,反过来读取文件中最后三个数字的最简单方法是按正向顺序读取整个文件,将最近看到的三个数字保存在缓冲区中.当你点击EOF时,只需向后处理该缓冲区.

一种更有效但更复杂的技术是猜测文件中最后三个数字之前但接近的位置; 寻找那个位置,然后丢弃角色,直到你突破; 并从那一点开始使用前一段中的技术.如果您猜错了,并且缓冲区中的数字少于三个,请再次猜测.

第三种方法是使用fseek(with SEEK_END)并fread读取文件的最后1024 个字节,设置指向块末尾的指针,然后向后解析.这将是非常有效的,但是会比以前的建议更加令人头疼的角落案例变得正确.(如果文件的最后三行总共超过1024个字节,你到底做了什么?)

仅供参考,在C中读取浮点数的正确方法是使用fgetsstrtod.不要使用任何一个atofscanf为此; atof没有告诉你语法错误,并scanf在溢出时触发未定义的行为.

PS如果你有shell实用程序tac(它是一个GNUism),最简单的选择就是编写你的程序来处理标准输入上的前三个数字,然后调用它tac < input.file | ./a.out. 略读代码让我相信tac实现了我的"第三种方法",还有一些额外的聪明才智.

  • @ace关于这个主题我的罐头咆哮在这里:/sf/ask/1701151231/#24318630(阅读所有评论!)标准的违规句子是C99 7.19.6.2p10:"如果[将接收转换结果的对象]没有合适的类型,*或者如果转换结果无法在对象*中表示,则行为是未定义的." 强调我的. (3认同)
  • @kay OP确实表示他们希望数字按相反的顺序排列,但你的想法也很好(总能自行扭转). (2认同)

Jos*_*yer 6

嗯,显而易见的方法是将它们全部读出来,将它们放入一个数组然后得到最后三个.

  • 如果文件非常大并且不需要顶部条目,则不实用. (7认同)