2017-05-23 13 views
-2

は、私はそれからの読み取りにC++はifstreamカントは、文字列を読み、読み文字

cout << "titre = "; 
cin >> livre.titre; 
cout << "isbn = "; 
cin >> livre.isbn; 
cout << "auteur = "; 
cin >> livre.auteur; 
cout << "annee = "; 
cin >> livre.annee; 
cout << "editeur = "; 
cin >> livre.editeur; 
cout << "prix = "; 
cin >> livre.prix; 
cout<<"===================="<<endl; 

ofstream write("livres",ios::app); 
write.write ((char *)&livre, sizeof livre); 
write.close();} 

及びこれをファイルに書き込むこのコードを持っているときにエラーを取得:

void affiche() 
{ 
    livres livre; 
    ifstream read ("livres"); 
    read.read ((char *)&livre,sizeof livre); 
    while (read) 
    {cout << "num : "<<livre.num<<" | isbn : "<< livre.isbn<<" | titre : "<<livre.titre<<" | auteur : "<<livre.auteur<<" | editeur : "<<livre.editeur<<" | annee : "<<livre.annee<<" | prix : "<<livre.prix<<endl; 
    read.read ((char *)&livre, sizeof livre); 
    }read.close(); 
} 

それはときに私の問題を場合は、例えば、私がcharすべて3つの文字の最初のCOUTに取得

char titre[3]; 
char auteur[3]; 
char editeur[3]; 

:例えばそのようなcharとして変数を作ります「abc」と「auteur」を「def」と編集し、「ghi」を編集します。私はtitreのために叫んでいます:abcdefghi、auteur defghiの、そして最後の:ghi。 問題はint変数では発生しません。 と私はこれらの変数を文字列に変更すると、コンパイラは正常に動作しますが、exeは最初の文字列coutに固執します。

私はあなたが助けてくれることを願っています。

フルコード:

class livres{ 
public: 
void creer() { 
    cout << "titre = "; 
    cin >> livre.titre; 
    cout << "isbn = "; 
    cin >> livre.isbn; 
    cout << "auteur = "; 
    cin >> livre.auteur; 
    cout << "annee = "; 
    cin >> livre.annee; 
    cout << "editeur = "; 
    cin >> livre.editeur; 
    cout << "prix = "; 
    cin >> livre.prix; 
    ofstream write("livres",ios::app); 
    write.write ((char *)&livre, sizeof livre); 
    write.close();} 
void affiche() { 
    livres livre; 
    ifstream read ("livres"); 
    read.read ((char *)&livre,sizeof livre); 
    while (read) 
    {cout << "num : "<<livre.num<<" | isbn : "<< livre.isbn<<" | titre : "<<livre.titre<<" | auteur : "<<livre.auteur<<" | editeur : "<<livre.editeur<<" | annee : "<<livre.annee<<" | prix : "<<livre.prix<<endl; 
    read.read ((char *)&livre, sizeof livre); 
    }read.close(); } 

private: 
    int isbn; 
    char titre[3]; 
    char auteur[3]; 
    char editeur[3]; 
    int annee; 
    int prix; 
    int num; 
}; 

int main() 
{ 
    livres livre; 
    livre.creer(); 
    livre.affiche(); 
     return 0; 
} 
+0

'char titre [3];'は、印刷可能な文字を_two_格納するだけの大きさです。 –

+0

'livres'クラスには' livre'という変数がありませんので、コンパイルエラーが発生するはずです。また、 'livre'は変数' livre'のアドレスを与えるため、 'livres'ファイルにゴミを書く可能性があります。 – ForceBru

+0

livreはlivresクラスのオブジェクトで、コンパイルエラーは発生しません。コードは文字なしで(整数だけで、1文字で)うまく動作します。 – ARDV

答えて

0

あなたの文字列があなたの意図した文字列の終わりを過ぎて読むためのプログラムを引き起こし、それの終わり、のヌル文字「\ 0」が欠けています。文字列の終わりを示すためにヌル文字が使用されるので、長さ3の任意の文字列は長さ4の配列を必要とするので、最後にヌル文字列のためのスペースがあります。詳細はこちらhttp://www.cplusplus.com/doc/tutorial/ntcs/

3文字の配列が連続したメモリに格納されているため、「abcdefghi」が表示されます。 '\ 0'文字がないので、プログラムは最初の配列を読み込み、次の2つを探します。

どのように文字を配列に割り当てるのですか?あなたはこのようにそれらを初期化した場合:

char titre[3] = "abc"; 

あなたはコンパイルエラーに

error: initializer-string for array of chars is too long [-fpermissive] 
    char titre[3] = "abc"; 

が表示されるはずコンパイラは、「ABC」を知っている、それはヌル文字のためにその第四のスペースを必要とするため、あまりにも長いです。

+0

ありがとうございます! うまく動作します。 – ARDV

+0

@ARDVあなたが提供した答えを受け入れることは、あなたにとってはうれしいことです。 –

関連する問題