【问题标题】:Cannot read the last line of a text file using the system call read无法使用系统调用 read 读取文本文件的最后一行
【发布时间】:2013-12-14 16:09:46
【问题描述】:

我正在使用 C 中的一个简单代码读取这个文本文件(逐个字符):

这是文件

printf 函数不会打印任何东西!

这只是一行文本(但它发生在文本文件的最后一行)。

这是代码:

int main(int argc, char *argv[])
{
    int fd, bytes_read;
    char buf;

    if((fd = open(argv[1], O_RDONLY)) == -1)
    {
        perror("open");
        exit(EXIT_FAILURE);
    }

    do
    {
        if((bytes_read = read(fd, &buf, sizeof(buf))) == -1)
        {
           perror("read");
           exit(EXIT_FAILURE);
        }

        printf("%c", buf);
    }
    while(bytes_read != 0);

    close(fd);
}

谢谢!

【问题讨论】:

  • 最后一行后面有一行空格吗?
  • 不...只是那一行文字!我知道如果有一个额外的空白行,问题就会消失,我想了解原因。谢谢!
  • 1.检查open()read()(...和close())的返回值是否有错误。 2.bytes_read的类型应该是size_t
  • @Crozin:读取返回一个ssize_t(一个有符号类型)。 size_t 未签名,将 ssize_t 转换为 size_t 实际上会破坏返回的错误代码。
  • @datenwolf 当然你是对的,谢谢你的纠正。

标签: c system call


【解决方案1】:

我不确定肯定这是否是原因,但可能是因为“非空源文件应以换行符结尾,其前面不应紧跟一个反斜杠字符。”

有关更多信息,请参阅http://robots.thoughtbot.com/no-newline-at-end-of-file/,这是一篇有趣的文章。

【讨论】:

  • 有趣的阅读。我也在我的外壳中尝试过。我将在文件末尾添加一个额外的行。我认为是最简单的解决方案。
【解决方案2】:

我在您的代码中没有发现任何错误检查。你确定你真的成功打开了文件吗?您必须检查每个系统调用的返回值,并根据遇到的错误谨慎行事。

【讨论】:

  • @user3102532:你是怎么检查的?您发布的代码 sn-p 不包含错误检查。除非您将它们编辑到您的代码 sn-p 中,否则我不会相信您。
【解决方案3】:

尝试在循环之后的某处添加fflush(stdout);。 输出流可能是行缓冲的。

【讨论】:

  • 当进程终止时,stdlib 应该被隐式刷新。如果这没有发生,则相关系统的 libc 已损坏。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-14
  • 2020-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
相关资源
最近更新 更多