неформатированный ввод в std :: string вместо c-string из двоичного файла - PullRequest
0 голосов
/ 17 мая 2010

хорошо, у меня есть эта программа, работающая с использованием c-строк. Мне интересно, можно ли читать в блоках неформатированный текст в std :: string? Я играл с if >>, но это читается построчно. Я ломал свой код и бился головой о стену, пытаясь использовать std :: string, поэтому я подумал, что пришло время привлечь экспертов. Вот рабочая программа, вам нужно предоставить файл "a.txt" с некоторым содержимым, чтобы он работал.

Я пытался дурачиться с:

in.read (const_cast<char *>(memblock.c_str()), read_size);

но это было странно. Я должен был сделать std::cout << memblock.c_str(), чтобы заставить его напечатать. и memblock.clear() не очистил строку.

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

Вот моя программа с использованием c-строк

// What this program does now:  copies a file to a new location byte by byte
// What this program is going to do: get small blocks of a file and encrypt them
#include <fstream>
#include <iostream>
#include <string>

int main (int argc, char * argv[]) 
{
 int read_size = 16;
 int infile_size;
 std::ifstream in;
 std::ofstream out;
 char * memblock;
 int completed = 0;

 memblock = new char [read_size];
 in.open ("a.txt", std::ios::in | std::ios::binary | std::ios::ate);
 if (in.is_open())
  infile_size = in.tellg();
 out.open("b.txt", std::ios::out | std::ios::trunc | std::ios::binary);

 in.seekg (0, std::ios::beg);// get to beginning of file

 while(!in.eof())
 {
  completed = completed + read_size;
  if(completed < infile_size)
  {
   in.read (memblock, read_size);
   out.write (memblock, read_size);
  } // end if
  else // last run
  {
   delete[] memblock;
   memblock = new char [infile_size % read_size];
   in.read (memblock, infile_size % read_size + 1);
   out.write (memblock, infile_size % read_size );
  } // end else
 } // end while
} // main

если вы увидите что-нибудь, что улучшит этот код, пожалуйста, дайте мне знать.

1 Ответ

4 голосов
/ 17 мая 2010

Вместо использования std::string рассмотрите возможность использования std::vector<char>; это поможет вам решить все проблемы с const_cast результатом вызова std::string::c_str(). Просто измените размер вектора до необходимого размера, прежде чем начать его использовать.

Если вы хотите напечатать содержимое, вы можете завершить нулевое содержимое вектора, вставив нулевой терминатор в конец:

std::vector<char> v;
v.push_back('\0');
std::cout << &v[0];

или вы можете преобразовать его в std::string:

std::vector<char> v;
std::string s(v.begin(), v.end());

Все это предполагает, что у вас есть какой-то блок текста, который вы хотите прочитать из двоичного файла. Если вы пытаетесь распечатать двоичные символы, это, очевидно, не сработает. Это не совсем понятно из твоего вопроса.

...