Как да съхранявате данни от файл, прочетен в двоичен режим C++

Здравейте, опитвам се да прочета файл, например 'sample.txt', в двоичен режим-c++ и трябва да съхраня текста на файла (напр. "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