Невозможно прочитать содержимое файла в буфер с помощью read ()

Ниже приведен пример кода, скомпилированного с помощью компилятора GNU (команда g ++) в ОС Ubuntu 16.04:

#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 можно найти Вот.

Вопрос: Почему содержимое файла не будет прочитано, если файл допустим и компилятор не выдаст ошибку?

Ts.mp4
разрешений

2

Решение

Предполагая, что вы работаете в 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,

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]