それは設計上の選択であったこと、なぜは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()
(どちらもstring
とvector
)を提供する任意のタイプの適切なイテレータタイプを作成するのに十分スマートです。それがテンプレートの魔法です。 :)
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つのことです。 はですが、フラグビットを設定するのではなく、例外をスローするようにストリームオブジェクトを設定してください:)
また、明示的なベクトル(size_type n、const T&value = T 、const Allocator&= Allocator()); '。最後の2つはデフォルト値を持っているので、 'ベクトル data(100);' –
Dan
@ JohnBのように見えますが、 '[]'がオーバーロードされていることを思い出しました。お返事をありがとうございます。 –
ええ私はあなたが意味することを知っている:)しかし、それはデータの先頭へのポインタを取得する正しい方法です:) – jcoder