0

好的,我有这个程序使用 c-strings 工作。我想知道是否可以将未格式化的文本块读入 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-strings 的程序

// 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

如果您看到任何可以使此代码更好的内容,请随时告诉我。

4

1 回答 1

4

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());

这一切都假设您有一些要从二进制文件中读取的文本块。如果您试图打印出二进制字符,这显然是行不通的。你的问题并不完全清楚。

于 2010-05-17T02:58:37.620 回答