Чтение всего файла в двоичном режиме с использованием C ++ - PullRequest
1 голос
/ 09 февраля 2012

Я пытаюсь прочитать весь файл JPG в двоичном режиме, используя Visual C ++. Код выглядит следующим образом:

FILE *fd = fopen("c:\\Temp\\img.jpg", "rb");
if(fd == NULL) {
    cerr << "Error opening file\n";
    return;
}

fseek(fd, 0, SEEK_END);
long fileSize = ftell(fd);
int *stream = (int *)malloc(fileSize);
cout << fileSize << '\n';
fseek(fd, 0, SEEK_SET);
int bytes_read = fread(stream, fileSize, 1, fd);
printf("%i\n", bytes_read);
fclose(fd);

Проблема в том, что bytes_read всегда равен 1. Переменная fileSize содержит правильный размер файла. Поэтому я не уверен, почему bytes_read всегда равно 1 и не равно fileSize ..?

Ответы [ 6 ]

2 голосов
/ 09 февраля 2012

Если вам нужно количество прочитанных байтов, вам нужно переключить аргументы следующим образом:

int bytes_read = fread(stream, 1, fileSize, fd);
2 голосов
/ 09 февраля 2012
int n_read = fread(stream, fileSize, 1, fd);

возвращает количество фрагментов размером fileSize, которое вы получили.В этом случае 1.

Посмотрите на раздел 7.21.8.1 стандарта C: http://www.open -std.org / jtc1 / sc22 / wg14 / www / docs / n1548.pdf (стр. 334)

Таким образом, вам нужно умножить n_read на fileSize, чтобы получить количество прочитанных байтов.

1 голос
/ 09 февраля 2012

С man 3p fread:

fread () и fwrite () возвращают количество успешно прочитанных или записанных элементов (т. Е. Не количество символов).Если возникает ошибка или достигается конец файла, возвращаемое значение - это короткий счетчик элементов (или ноль).

Вы сказали, что нужно прочитать 1 длину файла, и вот чтоэто читается.

1 голос
/ 09 февраля 2012
RETURN VALUE
       fread() and fwrite() return the number of items  successfully  read  or
       written  (i.e.,  not the number of characters).  If an error occurs, or
       the end-of-file is reached, the return value is a short item count  (or
       zero).

Вы сказали ему прочитать 1 предмет размером fileSize, и он это сделал.

0 голосов
/ 09 февраля 2012

При вызове fread вы говорите ему прочитать 1 байт ...

Это должно быть: fread (stream, 1, filesize, fd);

0 голосов
/ 09 февраля 2012

В C ++ вы можете использовать std::ifstream, который поставляется с идиоматическим стилем чтения:

std::ifstream file("file.bin", std::ifstream::binary); //binary mode!
std::istream_iterator<char> begin(file), end);  //setup iterators!
std::vector<char> v(begin,end);  //read all data into a vector!
//v contains the binary data, which you can use from now on

//you can get the pointer to the data as
char *buffer = &v[0];
size_t sizeOfBuffer = v.size();
//you can use buffer and sizeOfBuffer instead of v.

//just remember that the lifetime of buffer is tied with the lifetime of v
//which means, if v goes out scope, the pointer `buffer` will become invalid

Надеюсь, вы прочитали комментарии в приведенном выше фрагменте. : -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...