我需要从下往上读取文件中列出的数字。我如何使用 C 来做到这一点?
文件是这样的:
4.32
5.32
1.234
0.123
9.3
6.56
8.77
例如,我想读取最后三个数字。它们必须是 float
类型。
8.77
6.56
9.3
PS.: 实际上我需要一个使用 fseek 等来处理文件指针位置的解决方案
最佳答案
重要的是要了解现代操作系统不会跟踪文件中换行符的位置。 (VMS 可以,而且我很确定某些 IBM 大型机操作系统也可以,但您可能没有使用其中任何一个。)因此不可能寻找到线边界。也不可能以相反的顺序逐字节读取。
因此,逆向读取文件中最后三个数字的最简单方法是以正向顺序读取整个文件,将最近看到的三个数字保存在缓冲区中。当您遇到 EOF 时,只需向后处理该缓冲区。
一种更有效但更复杂的技术是猜测文件中最后三个数字附近但之前的位置;寻找那个位置,然后丢弃字符直到你遇到换行符;并从那时起使用上一段中的技术。如果您猜错了并且缓冲区中的数字少于三个,请再猜一次。
第三种方法是使用 fseek
(与 SEEK_END
)和 fread
读取文件的最后 1024 个左右 字节,将指针设置为 block 的末尾,然后向后解析它。这会非常有效,但会比之前的建议更令人头疼的极端情况。 (如果文件的最后三行总计超过 1024 字节长,您具体会怎么做?)
仅供引用,在 C 中读取 float 的正确方法是使用 fgets
和 strtod
.不要使用 atof
或 scanf
为了这; atof
没有告诉你语法错误,scanf
在溢出时触发未定义的行为。
附言如果您有 shell 实用程序 tac
(这是一个 GNUism),最简单的选择是编写程序来处理标准输入上的前三个数字,然后将其作为 tac < input.file | ./a.out
调用。 . Skimming the code让我相信tac
实现我的“第三种方法”,还有一些额外的聪明。
关于c - 如何使用 C 从下往上读取行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29884493/