C ++ ifstream 无法读取字符串,并且在读取字符时出错
c++ ifstream cant read string, and getting error when read 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 ();}
从文件中读取的这个:
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
输出是 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;
}
字符数组末尾缺少空字符"\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 个空格来获取空字符。
相关文章:
- 如何在 C++ 中从文件中读取字符数组(带有一些空格)
- 从矢量C++读取字符时出现问题
- 从格式化输入操作中获取读取字符数
- 使用 cin.get 读取字符数组
- 按下回车键时,如何使数组停止读取字符
- C++:读取字符是不正确的
- 如何从输入文件中读取字符并将其存储到向量中?
- 线程函数无法从堆上分配的缓冲区中读取字符
- 使用 cin.get() 读取字符
- C++:使用 fgets() 读取字符输入时出错
- C++ 从文件中读取字符,计算每个字符并进行排序
- C ++ ifstream 无法读取字符串,并且在读取字符时出错
- 逐字读取字符数组,无需字符串函数
- 是否有任何方法可以在用户输入文本时读取字符
- 从字符串中读取字符时出错
- 如何按字符从文件到2D数组读取字符
- 重载>>运算符和读取字符
- 从堆栈中读取字符后,如何修复不正确的文件输出
- 如何从文件中读取“”字符
- 读取字符 * 始终具有相同的地址