БлогNot. C++: прочитать файл как вектор из символов char

C++: прочитать файл как вектор из символов char

В примере читается текстовый файл data.txt из текущей папки, но будет прочитан и любой бинарный.

Метод vectorRead возвращает вектор, сформированный из байтов нужного файла. Обратите внимание, что вектор должен быть создан в "куче", явным вызовом конструктора new, а не в стеке как локальная переменная (то есть, не кодом вида vector <char> v(len);).

Цикл в главной функции печатает символы в 16-ричном представлении по 16 штук в строке, таким образом, получается 16-ричный дамп файла средствами <iostream>.

Проблемы также может создать то, что в Studio тип данных char по умолчанию - знаковый, соответственно, коды русских букв в однобайтовой кодировке отрицательны. Мы их преобразуем оператором вида if (c < 0) c += 256;

Проверено в консоли Studio 2015.

#include <iostream>
#include <iomanip> /* для setw и setfill */
#include <fstream>
#include <vector>
using namespace std;

vector <char> *vectorRead (ifstream *is) {
 is->seekg(0, is->end);
 int len = is->tellg();
 is->seekg(0, is->beg);
 vector <char> *v = new vector <char>(len);
 if (v == nullptr) { return nullptr; /* No memory */ }
 is->read(&v->front(), static_cast<size_t>(len));
 return v;
}

int main() {
 ifstream is ("data.txt", ios::binary);
 vector <char> *v;
 if (is) {
  v = vectorRead(&is);
  is.close();
  cout << v->size() << " bytes read" << endl;
  for (int i = 0, k = 0; i < v->size(); i++) {
   int c = v->at(i);
   if (c < 0) c += 256; //т.к. char - знаковый
   cout << setw(2) << setfill('0') << hex << c;
   if (++k%16) cout << " "; 
   else {
    cout << endl; k = 0;
   }
  }
 }
 cin.sync(); cin.get(); 
 return 0;
}

07.11.2017, 22:21 [2518 просмотров]


теги: учебное список c++ studio

К этой статье пока нет комментариев, Ваш будет первым