我需要从下到上读取文件中列出的数字.我怎么能用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中读取浮点数的正确方法是使用fgets
和strtod
.不要使用任何一个atof
或scanf
为此; atof
没有告诉你语法错误,并scanf
在溢出时触发未定义的行为.
PS如果你有shell实用程序tac
(它是一个GNUism),最简单的选择就是编写你的程序来处理标准输入上的前三个数字,然后调用它tac < input.file | ./a.out
. 略读代码让我相信tac
实现了我的"第三种方法",还有一些额外的聪明才智.