无法使用 read() 将文件内容读入缓冲区
Unable to read file contents into buffer using read()
以下是在 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。
问题:为什么当文件是合法的并且编译器没有抛出错误时,却不读取文件内容?
假设您是 运行 Linux,errno
值 14 是 EFAULT
,或 "bad address"。
给定代码
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
.
以下是在 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。
问题:为什么当文件是合法的并且编译器没有抛出错误时,却不读取文件内容?
假设您是 运行 Linux,errno
值 14 是 EFAULT
,或 "bad address"。
给定代码
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
.