从文件读取问题。 read()系统调用

时间:2019-01-28 18:00:21

标签: c unix glibc

当我尝试从文件中读取数据并进行打印时, printf 会在终端上打印一个空字符串。

  

使用:Ubuntu 16.04。

     

gcc版本5.4.0。

     

内核:4.15.0-43通用

尝试:

  写入数据后

添加 fsync 调用。

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

#define SIZE 6

int main()
{
   int ret = -1;
   char buffer[SIZE] = { 0 };
   int fd = open("data.txt", O_CREAT | O_RDWR, 0666);

   if (fd < 0)
   {
   perror("open()");
   goto Exit;
   }

   if (write(fd, "Hello", 5) < 0)
   {
       perror("write()");
   goto Exit;
   }

   fsync(fd);

   if (read(fd, buffer, SIZE - 1) < 0)
   {
   perror("read()");
   goto Exit;
   }

   printf("%s\n", buffer);
   ret = 0;

   Exit:
        close(fd);
        return ret;
}

期望:应该从文件写入数据或从文件读取数据。

实际:数据写入文件。读取数据后, printf 打印一个空字符串。

1 个答案:

答案 0 :(得分:2)

写入后,您需要倒带该文件。

修复:

lseek(fd, 0, SEEK_SET);

请注意,通常不需要对读缓冲区进行零初始化,这是浪费时间。您应该使用read / recv的返回值来确定接收到的数据的长度,并在必要时手动将其终止为零。

修复:

ssize_t r = read(fd, buffer, SIZE - 1);
if (r < 0)
    // handle error
buffer[r] = 0; // zero-terminate manually.
printf("%s\n", buffer);