C ++ ifstream 无法读取字符串,并且在读取字符时出错

c++ ifstream cant read string, and getting error when read char

本文关键字:读取 字符 出错 字符串 ifstream      更新时间:2023-10-16

我有这段写入文件的代码:

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 个字符。例如,如果我用'abc'填充titre,用'def'填充auteur,用'ghi'填充editeur;我从 cout 获得的 titre 输出是 abcdefghiauteur 的 cout 输出是 defghiediteur 的输出是 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;
}

字符数组末尾缺少空字符"\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"太长,因为它需要第 4 个空格来获取空字符。