C:向后阅读文件:为什么这种特殊方法不被认为是好的?

时间:2016-07-19 23:14:34

标签: c operating-system

您好我对以下问题有疑问:在操作系统教科书" 操作系统深度由Thomas W Doeppner ",其中一章练习题要求我们查找用于向后读取文件内容的给定代码的错误,并且还要求更好的方法来执行此操作。现在我已经遇到过很多方法可以做到这一点,但是真的无法找出为什么以下不被视为一种好方法

感谢您的时间和帮助,谢谢!

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>

int main() {
    int fd;
    off_t fptr;
    fd = open("./file.txt", O_RDONLY);
    char buf[3];
    /* go to last char in file */
    fptr = lseek(fd, (off_t)-1, SEEK_END);
    while (fptr != -1) {
        read(fd, buf, 1);
        write(1, buf, 1);
        fptr = lseek(fd, (off_t)-2, SEEK_CUR);
    }
    return 0;
}

1 个答案:

答案 0 :(得分:3)

代码中说明的方法效率低下,因为您为文件中的每个字节进行了3次系统调用。此外,您不会检查read()write()函数调用的返回值,也不会检查文件是否已成功打开。

为了提高效率,您应该缓冲输入/输出操作。

  • 使用putchar()代替write()将更有效,更可靠。
  • 一次读取一大块文件内容(从几千字节到几兆字节)也会更有效。

与往常一样,对生成的代码进行基准测试,以衡量实际的性能改进。