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

标签 c file-read

我需要从下往上读取文件中列出的数字。我如何使用 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 .不要使用 atofscanf为了这; atof没有告诉你语法错误,scanf在溢出时触发未定义的行为。

附言如果您有 shell 实用程序 tac (这是一个 GNUism),最简单的选择是编写程序来处理标准输入上的前三个数字,然后将其作为 tac < input.file | ./a.out 调用。 . Skimming the code让我相信tac实现我的“第三种方法”,还有一些额外的聪明。

关于c - 如何使用 C 从下往上读取行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29884493/

相关文章:

c++ - .so 库中的全局变量

python - 如何使用 python 将响应写入 JSON 格式的文件中?

hadoop - 使用 Java API 从 HDFS (Hortonworks Sandbox) 读取文件时出现异常

c++ - 根据用户输入对文件进行排序

java - Java 中读取文件类型 (MIME) 返回 null

c - GNU Pth(Gnu 可移植线程)的 Windows 端口/实现

c - 尝试打印字符时程序崩溃

C:十进制值

c - 切换数组中的两个元素

c - 使用 POSIX 读取文件