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

в продолжение моего предыдущего вопроса ( Чтение всего файла в двоичном режиме с использованием C ++ )

После чтения файла jpg в двоичном режиме результат операции чтения всегда4 байта.Код:

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);
fseek(fd, 0, SEEK_SET);
int bytes_read = fread(stream, fileSize, 1, fd);
printf("%x\n", *stream);
fclose(fd);

Второй последний оператор printf всегда печатает первые 4 байта, а не все содержимое файла.Как мне распечатать все содержимое файла jpg?

Спасибо.

Ответы [ 3 ]

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

Вы хотите это в C ++? Это откроет файл, прочитает все содержимое в массив и выведет вывод на экран:

#include <fstream>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
   ifstream in;

   in.open("C:\\ISO\\ITCHOUT.txt", ios::in | ios::binary);

   if(in.is_open())
   {
      // get the starting position
      streampos start = in.tellg();

      // go to the end
      in.seekg(0, std::ios::end);

      // get the ending position
      streampos end = in.tellg();

      // go back to the start
      in.seekg(0, std::ios::beg);

      // create a vector to hold the data that
      // is resized to the total size of the file    
      std::vector<char> contents;
      contents.resize(static_cast<size_t>(end - start));

      // read it in
      in.read(&contents[0], contents.size());

      // print it out (for clarity)
      for(const char& c : contents)
      {
         cout << c;
      };
   }
}
0 голосов
/ 09 февраля 2012

Что-то вроде следующего должно сделать это. bytes_read () дает вам количество прочитанных блоков, в вашем случае размер блока равен размеру файла, поэтому можно прочитать только один блок.

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

            char *stream = (char *)malloc(fileSize);
            fseek(fd, 0, SEEK_SET);
            int bytes_read = fread(stream, fileSize, 1, fd);
            for(int i=0; i<fileSize; i++){
                    printf("%d ", stream[i]);
            }

Я печатаю символы в виде чисел, поскольку двоичные данные не читаются в консоли. Я не знаю, как вы хотели, чтобы данные были отформатированы.

Это просто ссылка на ваш образец. Вы должны действительно рассмотреть возможность использования образца Чада. Это гораздо худшее решение (поскольку смешивание C / C ++ слишком много) просто ради полноты.

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

stream - указатель на int (первый элемент выделенного вами массива 1 ). *stream разыменовывает этот указатель и дает вам первый int.

Указатель не является массивом. Указатель не является буфером. Следовательно, он не несет никакой информации о размере массива, на который он указывает. Невозможно распечатать весь массив, указав только указатель на первый элемент.

Какой бы метод вы не использовали для его распечатки, вам необходимо предоставить информацию о размере вместе с указателем.

C ++ в стандартной библиотеке имеет пакет указатель + размер: std::vector. Я бы порекомендовал использовать это. Кроме того, вы можете просто пройтись по массиву самостоятельно (что означает использование информации о размере) и распечатать все его элементы.

1 Убедитесь, что размер файла кратен sizeof(int)!

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