Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无法使用read()将文件内容读入缓冲区_C++_File_Fcntl_Unistd.h - Fatal编程技术网

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

C++ 无法使用read()将文件内容读入缓冲区,c++,file,fcntl,unistd.h,C++,File,Fcntl,Unistd.h,以下是在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.

以下是在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$ ./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调试

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


假设您正在运行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

你有很多不同的和不相关的问题。请每个问题只问一个问题。哦,但我只有一个问题,为什么我无法打开文件使用std::string、std::vector、std::array、fstream not char指针并打开。
if(filedes==0)std::cout@manni66使用std::string、std::vector、std::array、fstream not char指针和open。在所有这些代码层下,您认为
std::vector
std::array
fstream
实际用于将数据读入进程地址空间的是什么?也许OP是在试图了解事物的实际工作原理,并希望使用
read()
char buffer[ 1024 ]
   .
   .
   .
ssize_t ret = read(filedes,buffer,NumBytesToRead);