Работа с бинарным файлом

p1ka4y777

почему программа не выводит 16-ричный дамп бинарного файла?
int main () 
{
  streamoff lSize;
  char *buffer;
  
  ifstream File("myfile.bin" , ios::binary);
  if (!File) 
  {
      cerr << "File error"; 
      exit (1);
  }
 
  // получить размер файла:
  File.seekg(0 , ios::end);
  lSize = File.tellg();
  File.seekg(0);
 
  // выделить память для размещения файла:
  buffer = new (nothrow)
      char[lSize];
  if (buffer == NULL) 
  {
      cerr << "File error"; 
      exit (1);
  }
 
  // скопировать файл в буфер:
  File.read(buffer, lSize);
  if (!File) 
  {
      cerr << "Reading error"; 
      exit (3);
  }
  /* весь файл теперь загружается в буфер памяти. */
 
  for (long i = 0; i < lSize; i++)
    cout << hex << (int)buffer[i] << ' ';
  
// завершение
  File.close ();
  free (buffer);
 
  return 0;
}
и как избавиться от этой ошибки: warning C4244: инициализация: преобразование "std::streamoff" в "unsigned int", возможна потеря данных
14 ответов

p1ka4y777

std::streamoff в твоей имплементации длинее int. это как здесь аналогично:
long l = 9999999;
char ch = l;// то же предупреждение выдаст
да, buffer ты должен delete, not freeа покажи, что программа выводит.и как ты представляешь, что должна бы выводить.


p1ka4y777

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


p1ka4y777

как это должно выглядеть
Стандартно. Вот так, например:
HD 1.0 : HexDump for file 'p0003.png' [00000000:00000040]

00000000: 89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52 ‰PNG........IHDR
00000010: 00 00 02 EF 00 00 04 00 08 00 00 00 00 74 2A E8 ...п.........t*и
00000020: E0 00 00 20 00 49 44 41 54 78 DA EC 5D 2B 70 DC а.. .IDATxЪм]+pЬ
00000030: CA B6 5D E7 D5 AD 6A 90 19 24 62 0D 12 90 06 19 К¶]зХ*jђ.$b..ђ..
00000040: 64 CE F0 88 4D 95 9E F9 49 D0 21 0E 0B 70 5D F2 dОр€M•ћщIР!..p]т


p1ka4y777

а покажи, что программа выводит.
File error


p1ka4y777

File error
В каком месте кода? В 9 строке или 23? myfile.bin существует и где находится?


p1ka4y777

в 9 в папке проекта файл не создался


p1ka4y777

в папке проекта файл не создался
И не должен. Это когда для записи открывается, то создаётся, а если для чтения, то должен существовать и находиться в папке проекта (обычно).


p1ka4y777

И не должен.
т.е. мне не нужно создавать файл?


p1ka4y777

т.е. мне не нужно создавать файл?
Можно готовый использовать.


p1ka4y777

Можно готовый использовать.
использовал готовый, который имел содержимое: 1234567890 после компиляций вывело: 31 32 33 34 35 36 37 38 39 30 так и должно быть?P.S. что и где нужно прописать, чтобы компилятор закрывался после нажатия любой клавиши...


p1ka4y777

ну да, это и суть шестнадцатеричные значения этих символов. только тебе нужно было продемонстрировать работу с бинарными файлами, возьми что-нибудь, содержащее байты больше 127, если это - задание. возьми сожми этот же текстовый файл, к примеру, и его используй.


p1ka4y777

возьми что-нибудь, содержащее байты больше 127
можете выложите такой для примера?просто не понял немного... мне нужно просто связать любой файл, который "весит" больше 127 байт, да?


p1ka4y777

можете выложите такой для примера?
Возьмите любой не текстовый файл, хотя бы, .exe своего кода (в папке Debug), скопируйте его в папку проекта, и измените ему имя на myfile.bin.


p1ka4y777

#include <iostream>
#include <fstream>
#include <iterator>
#include <iomanip>
 
int main(void)
{
    std::ifstream input_file("file_to_open");
    std::istreambuf_iterator<char> bin_file_iterator(input_file);
    short offset = 0;
    std::string text;
    unsigned char byte;
    std::cout<<std::hex<<std::setfill('0')<<std::setw(5)<<offset<<":  ";;
    while(bin_file_iterator != std::istreambuf_iterator<char>())
    {
        byte = *bin_file_iterator;
        std::cout<<std::setw(2)<<static_cast<int>(byte)<<" ";
        if(byte > 0x7e || byte < 0x20)
            text += '.';
        else
            text += byte;
        ++bin_file_iterator, ++offset;
        if(offset % 16 == 0)
        {
            std::cout<<" |"<<text<<"|"<<std::endl;
            std::cout<<std::setw(5)<<offset<<":  ";
            text.clear();
        }
    }
    while((offset++ % 16) != 0) std::cout<<"   ";
    std::cout<<" |"<<text<<"|"<<std::endl;
    input_file.close();
    return 0;
}
$./a.out | head
00000: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 |.ELF............|
00010: 02 00 3e 00 01 00 00 00 78 07 40 00 00 00 00 00 |..>.....x.@.....|
00020: 40 00 00 00 00 00 00 00 50 41 00 00 00 00 00 00 |@.......PA......|
00030: 00 00 00 00 40 00 38 00 09 00 40 00 25 00 22 00 |....@.8...@.%.".|
00040: 06 00 00 00 05 00 00 00 40 00 00 00 00 00 00 00 |........@.......|
00050: 40 00 40 00 00 00 00 00 40 00 40 00 00 00 00 00 |@.@.....@.@.....|
00060: f8 01 00 00 00 00 00 00 f8 01 00 00 00 00 00 00 |................|
00070: 08 00 00 00 00 00 00 00 03 00 00 00 04 00 00 00 |................|
00080: 38 02 00 00 00 00 00 00 38 02 40 00 00 00 00 00 |8.......8.@.....|
00090: 38 02 40 00 00 00 00 00 1c 00 00 00 00 00 00 00 |8.@.............|
$ ./a.out | tail
054b0: 75 74 40 40 47 4c 49 42 43 58 58 5f 33 2e 34 00 |ut@@GLIBCXX_3.4.|
054c0: 5f 5f 64 73 6f 5f 68 61 6e 64 6c 65 00 5f 5f 6c |__dso_handle.__l|
054d0: 69 62 63 5f 63 73 75 5f 69 6e 69 74 00 5f 5f 62 |ibc_csu_init.__b|
054e0: 73 73 5f 73 74 61 72 74 00 5f 65 6e 64 00 5f 5a |ss_start._end._Z|
054f0: 53 74 34 65 6e 64 6c 49 63 53 74 31 31 63 68 61 |St4endlIcSt11cha|
05500: 72 5f 74 72 61 69 74 73 49 63 45 45 52 53 74 31 |r_traitsIcEERSt1|
05510: 33 62 61 73 69 63 5f 6f 73 74 72 65 61 6d 49 54 |3basic_ostreamIT|
05520: 5f 54 30 5f 45 53 36 5f 40 40 47 4c 49 42 43 58 |_T0_ES6_@@GLIBCX|
05530: 58 5f 33 2e 34 00 5f 65 64 61 74 61 00 6d 61 69 |X_3.4._edata.mai|
05540: 6e 00 5f 69 6e 69 74 00 |n._init.|