我有这样的代码写入到文件:
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
为:
char titre[3];
char auteur[3];
char editeur[3];
第一cout
将输出的所有3个字符。例如,如果我填titre
与'abc'
和auteur
与'def'
和editeur
与'ghi'
;输出笔者从COUT得到titre
是abcdefghi
,从COUT为auteur
输出defghi
,输出为editeur
是ghi
。如果我定义我的三个变量作为int
s不会发生此问题。而当我改变这些变量的字符串,编译器效果很好,但在第一个字符串COUT的exe棒。
下面是完整的代码:
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”。空字符用来标记字符串的结束,因此长度为3的任何字符串需要长度为4的阵列,使得存在用于在端部空字符串空间。这里更多的信息:http://www.cplusplus.com/doc/tutorial/ntcs/
你所看到的“ABCDEFGHI”因为你的三个字符数组存储在连续的内存。由于没有“\ 0”字符,程序读取你过去的第一阵列,并认为接下来的两个。
你是如何分配的字符数组的?如果初始化他们是这样的:
char titre[3] = "abc";
您应该看到一个编译错误
error: initializer-string for array of chars is too long [-fpermissive]
char titre[3] = "abc";
编译器知道“ABC”太长,因为它需要一个空字符第四空间。