【问题标题】:linux read() function from unistd.h doesn't work for me :(unistd.h 中的 linux read() 函数对我不起作用:(
【发布时间】:2020-11-11 18:42:27
【问题描述】:

我尝试了所有我能想到的方法,但由于某种原因,它没有将文件中的数据存储到“数据”中,但文件中有写入的数据。

#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>

using namespace std;

int main()
{
   char data[69]=" ";
   int fd = open("./MyFile.txt", O_RDWR | O_CREAT | O_SYNC | O_RSYNC);
   write(fd, "HELLO", 5);
   read(fd, data, 5);

   cout << data << endl;

return 0;
}

你们能帮帮我吗?我正在尝试学习文件 I/O,但我不知道是 O_RDWR 还是这里有什么问题。

【问题讨论】:

    标签: c++ linux file-io fcntl unistd.h


    【解决方案1】:

    来自man write

    对于可查找的文件(即,可以应用 lseek(2) 的文件,例如,常规文件)写入发生在当前文件偏移量处,文件偏移量增加实际写入的字节数。

    来自man read

    在支持查找的文件上,读取操作从当前文件偏移量开始,文件偏移量按读取的字节数递增。

    你需要seek回到你的write之后的文件开头,如果你想那么read你刚刚写的:

    lseek(fd, 0, SEEK_SET);
    

    始终阅读和研究您使用的函数的文档,尤其是当它们没有按照您的想法执行时。

    【讨论】:

    • 太棒了,我不知道文件指针已更改,谢谢:D
    • 鉴于您“尝试了我能想到的一切”,我猜您并没有想到简单地阅读文档;)
    • 我会在 9 分钟内将此标记为答案,现在不能这样做:3
    • 如果有人不知道该怎么做,请查看 lseek()
    • lseek (fm, 0, SEEK_SET);
    【解决方案2】:

    文件描述符位置在write(2) 之后的末尾。从开头到read(2),需要将fd倒回开头。

    您可以使用lseek

       write(fd, "HELLO", 5);
       lseek(fd, 0, SEEK_SET);
       read(fd, data, 5);
    

    您还应该为所有这些系统调用(open、read、write、lseek)添加错误检查。

    【讨论】:

    • 我这样做了,但我删除了所有错误检查和一切以简化程序
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-03
    • 2022-11-13
    • 1970-01-01
    相关资源
    最近更新 更多