c ++ ifstream无法读取字符串,并在读取char时出错

时间:2017-05-23 16:20:26

标签: 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,如下所示:

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

第一个cout将输出所有3个字符。例如,如果我使用titre填充'abc'auteur填充'def'editeur填充'ghi';我从titre的cout获得的输出是abcdefghi,来自auteur的cout的输出是defghi,而editeur的输出是ghi }。如果我将我的三个变量定义为int s,则不会出现此问题。当我将这些变量更改为字符串时,编译器运行良好,但是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;
}

1 个答案:

答案 0 :(得分: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”太长,因为它需要第四个空格用于空字符。