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>a を実行する際の問題をすべて回避できます。使用を開始する前に、必要なサイズにベクターのサイズを変更するだけです。const_caststd::string::c_str()

内容を印刷したい場合は、null ターミネータを背面にプッシュすることで、ベクトルの内容を null で終了できます。

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 に答える