gpt4 book ai didi

c++ - 无法使用 read() 将文件内容读入缓冲区

转载 作者:搜寻专家 更新时间:2023-10-31 00:27:56 28 4
gpt4 key购买 nike

以下是在 Ubuntu OS 16.04 上使用 GNU 编译器(g++ 命令)编译的示例代码:

#include<iostream>
#include<unistd.h>
#include<fcntl.h>
#include <errno.h>
int main()
{ char* pBuffer;

char* storedfilepath = "/home/rtpl/Desktop/ts.mp4";

std::cout<<"\n Opening file at "<<storedfilepath<<"\n";

int NumBytesToRead = 1000 ;
int filedes = open(storedfilepath,O_RDONLY);

std::cout<<"\n value of error is "<<errno<<"\n";

std::cout<<"\n value of filedes is "<<filedes;

if (filedes==0)
std::cout<<"\n File cannot be opened";
else
{
std::cout<<"\n File opened successfully";
std::cout<<"\n Now reading file\n";

}

//if(
int ret = read(filedes,pBuffer,NumBytesToRead);

std::cout<<"\n value of error is "<<errno<<"\n";

if(ret!= -1)
std::cout<<"\n File read successfully";
else
std::cout<<"\n File contents cannot be read";

std::cout<<"\nEnd.\n";

close(filedes);
return 0;

}

编译时;我收到此消息:

rtpl@rtpl-desktop:~/Desktop$ g++ -g checkts.cpp
checkts.cpp: In function ‘int main()’:
checkts.cpp:8:27: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
char* storedfilepath = "/home/rtpl/Desktop/ts.mp4";

执行时:

rtpl@rtpl-desktop:~/Desktop$ ./a.out

Opening file at /home/rtpl/Desktop/ts.mp4

value of error is 0

value of filedes is 3
File opened successfully
Now reading file

value of error is 14

File contents cannot be read
End.

可以找到整个 gdb 调试 here .

问题:为什么当文件合法且编译器没有抛出错误时不读取文件内容?

Ts.mp4 permissions

最佳答案

假设您正在运行 Linux,errno 值为 14 是 EFAULT,或“错误地址”。

给定代码

char* pBuffer;
.
.
.
int ret = read(filedes,pBuffer,NumBytesToRead);

pBuffer 未初始化或以其他方式设置,因此 pBuffer 中的值是不确定的,它肯定没有指向有效地址。

您实际上需要提供一个缓冲区,read() 可以放置读取的数据:

char buffer[ 1024 ]
.
.
.
ssize_t ret = read(filedes,buffer,NumBytesToRead);

可以工作,只要 NumBytesToRead 不超过 buffer 中的字节数。还要注意 ret 现在是正确的 ssize_t 而不是 int

关于c++ - 无法使用 read() 将文件内容读入缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47175465/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com