C ++ ifstream的读取倾斜字符串,并得到错误读取字符时

问题描述 投票:-2回答:1

我有这样的代码写入到文件:

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得到titreabcdefghi,从COUT为auteur输出defghi,输出为editeurghi。如果我定义我的三个变量作为ints不会发生此问题。而当我改变这些变量的字符串,编译器效果很好,但在第一个字符串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;
}
c++ ifstream
1个回答
1
投票

你的字符数组没有在它的结束,这将导致程序读取过去你打算字符串末尾空字符“\ 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”太长,因为它需要一个空字符第四空间。

© www.soinside.com 2019 - 2024. All rights reserved.