2012-01-13 6 views
0

私は以下の問題があります。標準のistreamバッファをC++で読むには?

class foo{ 
    private: 
     char* cod; 
     ... 
    public: 
     foo(); 
     void getVal(); 
     ... 
} 

をそうで、など:私は次のように、オブジェクトの「コード」を指すように意図char型のポインタである属性を持つクラスを実装する必要があります。 getVal()は標準のistreamからコードを取得し、コードを含むすべての情報を埋め込むメソッドです。問題は、オブジェクトを特定する「コード」が特定の文字数を超えることができないことです。これは、メソッドGETVAL()のためにカスタマイズされたバッファを使用せずに行う必要がありますので、私は次の操作を行うことはできません。

//suppose the maximum number of characters is 50 
void foo::getVal() 
{ 
    char buffer[100]; 
    cin >> buffer; 
    if (strlen(buffer) > 50) //I'm not sure this would work considering how the stream 
           of characters would be copied to buffer and how strlen 
           works, but suppose this tells me how long the stream of 
           characters was. 
    { 
     throw "Exception"; 
    } 
    ... 
} 

これは禁止されています。カスタマイズされたistreamやboostライブラリも使用できません。

私は、istreamが情報を簡単に保持する場所を見つけることができたと思っていましたが、私はそれを見つけることができません。私が見つけたのは、他の種類のストリームに言及していただけです。

これを実行できるのか、ストリームがバッファされた情報を保持するのか誰かに教えてください。

おかげ

+0

あなたが欲しい特定の文字数を持っている場合、私はあなたが 'read'をしたいと思います方法。 –

+0

ローカライズしすぎると投票を終了しました。制限は任意であり、現実世界には適用できません。 –

+0

あなたは何をしようとしていますか?ストリームからコードを読み込みたいとします。コードの形式は何ですか? – user763305

答えて

0

はい、間違いなくうまくいくのstrlenを使用して..youは、サンプルプログラムサイズより大きい入力6つの文字はサイズが> 6は

+0

幅を設定することを忘れないでください。さもなければ、バッファのオーバーフローが発生します。 'std :: cin >> std :: setw(10)>> buffer;' – pezcode

+0

いいえ、いいえ。私は禁止されている。私はistreamオブジェクトを操作する問題に対処する必要があります。私は、私が使用できないこの問題を解決する方法としてその例を挙げています。 – Heathcliff

+0

@Heathcliffあなたは、文字列のサイズが次の長さを超えてはならないという警告を表示することができます。ユーザーが強制的にWhileループに保持すると、ユーザーは強制的にあなたが保持しているサイズ。それ以外の方法もあります。 – Invictus

0

istreamstreambufを使用しています。

私は、www.cplusplus.comがクイックC++参照のためのかなり良い場所であることがわかりました。そこに行ってstreambufまたはその派生語filebufの使用方法を確認することができます。

+0

OK。私はそれについて読んで、私はいくつかの疑問を持っていた。 – Heathcliff

+0

OK。私はそれについて読んで、私はいくつかの疑問を持っていた。標準のistreamオブジェクトには、関連するストリームバッファを取得するrdbufというメンバ関数があり、streambufオブジェクトへのポインタを返します。 sbumpcというメソッドがあり、getポインタで現在ポイントされている文字を返します。これらのことが正しく動作することを理解していれば、cin.rdbuf() - > sbumpc()を使用して、属性 "code"に格納されていない最後の文字を比較できますか?のように、cin.rdbuf() - > sbumpc()が\ n(ユーザが20文字未満の文字列を入力したことを意味する)と違うかどうかを確認します。 – Heathcliff

0

オムが.... >>がアップ読み込み表示するための

int main() 
    { 

    char buffer[10]; 
    std::cout << "enter buffer:" ; 
    std::cin >>buffer; 
    if(strlen(buffer)>6) 
    std::cout << "size > 6"; 
    getch(); 
    } 

を書くことができます最初の空白に、strlenは最初のヌルまでカウントします。あなたが読む予定の文字列の真ん中に空白がないことと、連続して100文字以内であることがわかっている場合は、それらを混在させることができます。もしそうでなければ、投げる前にバッファーをオーバーランさせます。

また、バッファへのアクセスは、すでにそこにすべての文字列を付与するものではありません(文字列が部分的にバッファを読み、補充する必要、バッファスペースを過ぎて行くことができる...)

ブランクは、セパレータであれば、 std::stringを読んでその最終状態に反応するのはなぜですか?上のすべてのダイナミクスは、std :: stringの場合は>>の内部ですでに処理されています。

[以下のコメントの後にEDIT]

未知のサイズのシーケンスを格納するための唯一の方法は、動的に領域を割り当て、成長するために必要とされるとして、それが成長することです。これは、もはやそうではありません。

より多くのスペースが必要な場合は、それらを使用するか、独自のコードを書き込んで割り当てて再割り当てするかは、物質を変更しません。

私はこれらの要件の唯一の理由は、あなた自身の文字列クラスを書く際のあなたの能力を見ることだと考え始めています。そう ...

クラスを宣言して、サイズと容量を指定したクラスを宣言し、スペースを割り当て、ストアした量を追跡し、ストアが利用できないときは、別のより広いストアを割り当て、古いものをコピーして破棄し、それに応じてデータメンバを調整します。あなたはファイルバッファを充填する方法を制御していないので、ファイルバッファは、方法ではありません直接アクセス

+0

いいえ、私はその解決策を使用できません。私はistreamオブジェクトと属性を直接扱わなければなりません。istreamバッファを操作する(例:キャストを行う)場合を除いて、メソッドの内部バッファを使用しません。 – Heathcliff

+0

また、私は標準のC++コンテナを使うことができないので、ベクトルや文字列はありません。 – Heathcliff

関連する問題