2017-05-23 4 views
-2

ich diesen Code zu schreiben habenC++ ifstream kann nicht lesen Zeichenfolge, und immer Fehler beim Lesen char

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();} 

und diese von ihm zu lesen, in Datei:

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(); 
} 

das Problem, dass, wenn ich machen die Variablen als Zeichen wie das zum Beispiel:

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

i in der ersten cout Saiblings erhalten alle 3 Zeichen, zum Beispiel, wenn ich fülle titer mit 'abc' und 'auteur' mit 'def' und editeur mit 'ghi' ich bekomme in den cout für titer: abcdefghi, und in der cout des auteur defghi, und in der letzten: ghi. Das Problem tritt nicht mit int-Variablen auf. und wenn ich diese Variablen in Zeichenfolge ändern, funktioniert der Compiler gut, aber die Exe bleibt in der ersten Zeichenfolge cout.

ich hoffe, dass Sie helfen können.

der vollständige Code:

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];' ist nur groß genug, um _zwei_ druckbare Zeichen zu speichern. –

+0

Die Klasse 'Livres' hat keine Variable namens' Livre', daher sollten Kompilierungsfehler auftreten. Möglicherweise schreiben Sie auch Müll in die 'Livres'-Datei, da' & livre' Ihnen eine Adresse der Variable 'livre' gibt. – ForceBru

+0

Livre ist ein Objekt in der Klasse Livres, und ich bekomme keine Kompilierung Fehler, der Code funktioniert gut ohne Zeichen (mit nur ganzen Zahlen und mit einem char). – ARDV

Antwort

0

Charakter Array fehlt ein Null-Zeichen ‚\ 0‘ am Ende, die das Programm bewirkt, dass nach dem Ende des beabsichtigten Zeichenfolge zu lesen. Das Nullzeichen wird verwendet, um das Ende eines Strings zu markieren. Daher benötigt jeder String der Länge 3 ein Array der Länge 4, so dass am Ende Platz für den Nullstring ist. Weitere Informationen finden Sie hier: http://www.cplusplus.com/doc/tutorial/ntcs/

Sie sehen "abcdefghi", weil Ihre drei Zeichen-Arrays im zusammenhängenden Speicher gespeichert sind. Da es kein Zeichen '\ 0' gibt, liest das Programm das erste Array und findet die nächsten zwei.

Wie weisen Sie Ihren Arrays Zeichen zu? Wenn Sie sie wie folgt initialisiert:

char titre[3] = "abc"; 

Sie sollten

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

Der Compiler weiß „abc“ ist zu lang einen Compiler-Fehler, weil es, dass der 4. Platz für ein Null-Zeichen benötigt.

+0

vielen Dank! es funktioniert gut wissen. – ARDV

+0

@ARDV Es wäre nett von Ihnen, die Antwort, die caweeks zur Verfügung gestellt hat, zu akzeptieren. –

Verwandte Themen