2011-07-09 11 views
4

Cの配列が悪いことや、ベクトルやC++の文字列のようなよりスマートな選択肢を使うのが一般的なコンセプトだと思われます。ここでは問題ありません。何とか一人でSTLを使用してバイトのベクトルにすることができます私の入力: C++のifstream :: read()とCの配列

は、なぜ char* ... 質問へ ifstream入力データの read()メンバーであるないことを言いましたか?

関連する特別な質問:特にその範囲内に動的に割り当てられたC文字列を扱う場合、ios::badbitios::failbitをチェックしますか? catch()さんのC文字列の割り当てを解除しますか?

ありがとうございます。

答えて

2

割り当てられたベクトルに直接読み込むことができます(私はここからコンパイルする能力がないので、タイプミスや転置されたパラメータなどがあるかもしれませんが)アイデアは正しいです。

vector<char> data; 
data.resize(100); 

// Read 100 characters into the storage of data 
thing.read(&data[0], 100); 
+0

また、明示的なベクトル(size_type n、const T&value = T 、const Allocator&= Allocator()); '。最後の2つはデフォルト値を持っているので、 'ベクトル data(100);' – Dan

+0

@ JohnBのように見えますが、 '[]'がオーバーロードされていることを思い出しました。お返事をありがとうございます。 –

+0

ええ私はあなたが意味することを知っている:)しかし、それはデータの先頭へのポインタを取得する正しい方法です:) – jcoder

2

それは設計上の選択であったこと、なぜはifstream入力データの読み出し()メンバーがcharにない* ...

と述べました。必ずしも賢明なものではありません。

質問です:することができます私は何とか

std::vector<char>の基礎となるストレージがあることが保証されているバイトの連続(すなわち、メモリの単一ブロック)のベクトルへの入力、そうそう。 ifstream::readを使用するには、(a)ベクトルのサイズが十分に大きいことを確認する必要があります(.resize() - ではなく.reserve()!これは、使用していないcapacityに読み込んでいるデータを知る方法がないためですそのsize)、次に(b)ベクトルの先頭要素へのポインタを取得します(例えば、&v.front()または&(v[0]))。

ベクタのサイズを事前に設定したくない場合は、イテレータタイプと標準ライブラリアルゴリズムを使用する、さらに高度なテクニックがあります。これらは、最初にファイルの長さをチェックする必要なしに、ファイル全体をベクトルに簡単に読み込むことができるという利点があります(ファイルの長さをチェックするための標準的な方法は、思ったほど信頼できないかもしれません)。バイトのベクトルはもちろん、文字列ない

#include <iterator> 
#include <algorithm> // in addition to what you already have. 
// ... 
std::ifstream ifs; 
std::vector v; 
// ... 
std::istreambuf_iterator<char> begin(ifs), end; 
std::copy(begin, end, std::back_inserter(v)); 

はそれはのようになります。しかし、std::stringと全く同じことを行うことができます - std::back_inserter関数は、.push_back()(どちらもstringvector)を提供する任意のタイプの適切なイテレータタイプを作成するのに十分スマートです。それがテンプレートの魔法です。 :)

STLだけを使用していますか?

私は混乱しています。私はC++標準ライブラリについて話していると思っていました。あなたが話しているこのSTLは何ですか?

関連ボーナス質問:あなたがiOS用しばしばをチェックします:: badbitをとiOS :: failbit

いいえ。私は通常、読み取り操作の結果を直接確認できるような方法でコードを書いています。例/説明については、http://www.parashift.com/c++-faq-lite/input-output.html#faq-15.4を参照してください。

特に、そのスコープ内で動的に割り当てられたC文字列を使用する場合は、

これは一般的に悪い考えです。

catch()のC文字列の割り当てを解除しますか?

このようなことに対処する必要がある主な理由の1つです。これは正しいことは容易ではありません。しかし、例外をキャッチして、ios :: bitsをチェックすることは、まったく別の2つのことです。 ですが、フラグビットを設定するのではなく、例外をスローするようにストリームオブジェクトを設定してください:)