Как сохранить данные из файла, прочитанного в бинарном режиме C++

Привет, я пытаюсь прочитать файл, например, «sample.txt», в двоичном режиме-С++, и мне нужно сохранить текст файла (например, «nodeA nodeB») в векторе. например: «A A B E A B G», если это то, что находится в текстовом файле, я хочу прочитать его в двоичной форме, а затем сохранить в некоторой переменной, а затем выполнить с ним некоторые операции. Любая помощь будет оценена по достоинству. Пока у меня есть:

int main () {
  streampos begin,end;
  ifstream myfile ("example.bin", ios::binary);
  begin = myfile.tellg();
  myfile.seekg (0, ios::end);
  end = myfile.tellg();
  myfile.close();
  cout << "size is: " << (end-begin) << " bytes.\n";
  return 0;
}

Как получить текстовую часть в файле myfile?


person user3302936    schedule 14.02.2015    source источник


Ответы (2)


Вам нужен метод ifstream::read(char *,streamsize). Получив размер файла в байтах, вы можете прочитать данные в vector<char> правильного размера (после возврата к началу файла):

streamsize n=end-begin;
vector<char> data((size_t)n);

myfile.seekg(0,ios::beg);
myfile.read(&data[0],n);

Тип итератора vector<char> может не обязательно быть указателем char *, поэтому вместо этого мы передаем в качестве первого аргумента указатель на первый элемент вектора. Элементы std::vector гарантированно расположены рядом друг с другом, поэтому мы можем быть уверены, что запись в &data[0]+k эквивалентна &data[k] для действительных индексов k.

person halfflat    schedule 14.02.2015
comment
это не бинарный режим, мне НУЖЕН бинарный режим - person user3302936; 20.02.2015
comment
Если поток открыт в двоичном режиме, что вы и сделали, то у вас есть поток, который обходит любые специфические преобразования текста (например, перевод символов новой строки в собственное представление). Помимо этого, у вас есть выбор использования форматированного (например, operator>>) или неформатированные (например, read и seekg) операции. Если вы выполняете неформатированные операции с потоком, который был открыт в двоичном режиме, вы получаете необработанные символьные данные. - person halfflat; 20.02.2015

Ваш файл sample.txt или что-то в этом роде является текстовым файлом. Я полагаю, что вы хотите «прочитать это в двоичной форме», потому что вы думаете, что вам нужно сделать это, чтобы узнать размер данных, чтобы затем вы могли выделить хранилище этого размера в некоторой переменной, чтобы содержать данные.

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

#include <fstream>
#include <iterator>
#include <string>
#include <algorithm>

...

std::istream_iterator<char> eos; // An end-of-stream iterator
// Open your file
std::ifstream in("sample.txt"); 
if (!in) { // It didn't open for some reason.
    // So handle the error somehow and get out of here. 
}
// Your file opened OK
std::noskipws(in);  // You don't want to ignore whitespace when reading it
std::istream_iterator<char> in_iter(in); // An input-stream iterator for `in` 
std::string data;   // A string to store the data
std::copy(in_iter,eos,std::back_inserter(data)); // Copy the file to string

Теперь все содержимое sample.txt находится в строке data, и вы можете анализировать ее как хотите. Вы можете заменить std::string другим стандартным типом контейнера char, например. std::vector<char>, и это будет работать точно так же.

person Mike Kinghan    schedule 16.02.2015