2016-11-21 3 views
0

私は、ofstreamに文字列とintを書き、ifstreamでその文字列を読み取ろうとしています。私は文字列がnullで終了すると期待しているので、ストリームは文字列がどこで停止し、どこでintが始まるかを知る必要があります。しかし、それは起こっていません - 私はそれを読み返すと、文字列の一部としてintを扱います。どうすればそれを避けることができますか?C++ストリームは、1つの文字列がどこで終わり、次の文字列が始まるかを知ることはできません。

#include <fstream> 
#include <string> 

int main() 
{ 
    std::string tempFile("tempfile.out"); 
    std::ofstream outStream(tempFile); //Tried this both with text 
    //and with ::bin but get same results 

    std::string outStr1("Hello"); 
    int outInt1 = 5; 
    std::string outStr2("Goodbye"); 

    outStream << outStr1 << outInt1 << outStr2; 
    outStream.close(); 

    std::ifstream inStream(tempFile); //Tried this both with text 
    //and with ::bin but get same results 
    std::string inStr1, inStr2; 
    int inInt1; 
    inStream >> inStr1; //this reads a string that concats all 
    //my prev values together! 
    inStream >> inInt1; //doesn't do what I want since the int was 
    //already read as part of the string 
    inStream >> inStr2; //doesn't do what I want 
} 

文字列と文字列を組み合わせて1つの文字列にするのではなく、文字列と整数を分けることができますか?

+1

ストリームに文字列またはintがありません。物事を区別したい場合は、それを行うためにフォーマットを考案して使用する必要があります。カンマ区切りの値とXMLは2つのアプローチです。他にもあります。 –

+1

ストリームはプロトコルではなく、バイトを送信できるパイプです。 –

+0

しかし、メモリ内の文字列にはヌルターミネータがあります。そのストリームはそのヌルターミネータを保存しませんか? – user2543623

答えて

0

あなたは、単に文字列

outStream << outStr1 << std::endl << outInt1 << std::endl << outStr2; 

しかし、なぜ改行が必要とされているを分離するために改行を追加することができますか?文字列はヌル文字で終了するので、 はnull文字をバイトストリームに書き込むべきではありませんか?もしそうなら、 なぜ改行が必要なのですか?

それは改行があなたのために働くだろうけれども、改行である必要はありません...

のstd :: stringは必ずしも終了NULである必要はありません。それはsizeであり、文字の配列/ベクトルのように扱われるべきです。 STRが構築されている場合のようにして、ストリームにNULを書き込むことができます:あなたは、ストリームからデータを読み込むサイズ2.

で文字列を構築

std::string outStr1{'H', 'e', 'l', 'l', 'o', 0}; 

std::string s("OK"); 

しばらく、それを のルールを知って、バイトを抽出し、期待されるタイプに変換する必要があります。基本的にストリームから文字列を読み込む場合、文字列をいつ終了するかを知る必要があります。単純なルールは、スペース( std::isspace())に達した場合、文字列が終了します。ここでスペースとは、空白、タブ、改行などを意味します。

整数を抽出する場合は、 'z'などの整数表記では正しくないcharに到達すると停止する必要があります。

これを完全に理解するには、http://en.cppreference.com/w/cpp/concept/FormattedInputFunctionが良いスタートです。

+1

戦術的注意: '\ n'は 'std :: endl'に組み込まれたストリームフラッシュのために' std :: endl'よりはるかに安価です。 – user4581301

+0

しかし、なぜ改行が必要ですか?文字列はヌル文字で終了するので、NULL文字をバイトストリームに書き込むべきではありませんか?もしそうなら、なぜ改行が必要ですか? – user2543623

関連する問題