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 [2617 просмотров]