在用vs2015编程学习文件流时出现问题,就是以二进制app方式写入和读取string类型时出现问题,只有第一次输入可以显示,之后增加字符串在此读取输出就会报错,求大神指点
以下是代码:
#include <string>
#include <iostream>
#include<iomanip>
#include<fstream>
using namespace std;
int main()
{
ofstream outfile("try.dat", ios::app | ios::binary);
string a;
cin >> a;
outfile.write((char*)&a, sizeof(a));
ifstream infile("try.dat", ios::in | ios::binary);
if (!infile)
{
cout << "weew";
}
infile.read((char*)&a, sizeof(a));
outfile.close();
infile.close();
cout << a << endl;
return 0;
}
以下是第一次运行情况,是正确的
接下来关闭后重新运行再次输入,会出现错误:
初学者不太明白这是为什么,第一次提问,求大神指点,先谢谢各位啦!
まず、
string
は単純な配列型ではなく、独自のメンバー変数とメンバー関数を持つクラスであることを理解する必要がありますそして a は文字列型なので、a のアドレスを取得するために
&a
を実行するのは意味がありません。それをchar*
と強制的に入力するのは意味がありません。string*
Forced をchar*
に変換するのは意味がありません、そうです。ポインタからポインタへの変換。 ポインタの値は ではなく、コンパイラに次のように指示するだけです。「これは同じポインタです。今度は私をstring*
として扱うのではなく、次のように扱います。」 achar*
(これは便利です...)質問の本来の目的は、文字列を従来の C 文字列 (つまり、char 配列) に変換することであると感じます。その後、
a.c_str()
を使用して実際のchar*
を取得してください (これは内部で構築されます)文字列、質問者のようにランダムに翻訳されません); さらに、この文字列の長さを取得するにはa.len()
を使用します。ところで、質問者が、
sizeof(a)
が文字列 の長さではない理由を本当に理解できない場合は、次の模倣例 (私が作成した) を見てください。 🎜> リーリーは常に
sizeof(a)
len_string的长度
=str的长度
であり、いわゆる文字列長の動的変更は8字节
とレコード長変数 が実装されています。new
1. 文字列の実装はライブラリごとに異なりますが、同じライブラリ内で同じことは、文字列内の文字列の長さに関係なく、その sizeof() が占有するスペースが動的に割り当てられることです。ヒープであり、sizeof() とは何の関係もありません。
so、write、read の 2 番目のパラメータがすべて間違っています。
2. 2 番目の実行エラーは、文字列
3 を破棄するときに発生しました。読み取りで受信するようにバッファを変更すると、データが存在しないはずです。実際にはオリジナルの
文字列の C スタイルのアドレスを取得するには、c_str() メンバーが必要で、長さは string.len です