visual-studio - 关于c++文件流读取和写入string类出错的问题,求解答
巴扎黑
巴扎黑 2017-04-17 14:23:23
0
3
647

在用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;
}

以下是第一次运行情况,是正确的

接下来关闭后重新运行再次输入,会出现错误:

初学者不太明白这是为什么,第一次提问,求大神指点,先谢谢各位啦!

巴扎黑
巴扎黑

全員に返信(3)
刘奇

まず、string は単純な配列型ではなく、独自のメンバー変数とメンバー関数を持つクラスであることを理解する必要があります

そして a は文字列型なので、a のアドレスを取得するために &a を実行するのは意味がありません。それを char* と強制的に入力するのは意味がありません。 string*Forced を char* に変換するのは意味がありません、そうです。ポインタからポインタへの変換。 ポインタの値は ではなく、コンパイラに次のように指示するだけです。「これは同じポインタです。今度は私を string* として扱うのではなく、次のように扱います。」 a char* (これは便利です...)

質問の本来の目的は、文字列を従来の C 文字列 (つまり、char 配列) に変換することであると感じます。その後、a.c_str() を使用して実際の char* を取得してください (これは内部で構築されます)文字列、質問者のようにランダムに翻訳されません); さらに、この文字列の長さを取得するには a.len() を使用します。

ところで、質問者が、sizeof(a) が文字列 の長さではない理由を本当に理解できない場合は、次の模倣例 (私が作成した) を見てください。 🎜> リーリー

は常に sizeof(a) len_string的长度=str的长度 であり、いわゆる文字列長の動的変更は 8字节 とレコード長変数 が実装されています。 new

いいねを押す +0
小葫芦

1. 文字列の実装はライブラリごとに異なりますが、同じライブラリ内で同じことは、文字列内の文字列の長さに関係なく、その sizeof() が占有するスペースが動的に割り当てられることです。ヒープであり、sizeof() とは何の関係もありません。
so、write、read の 2 番目のパラメータがすべて間違っています。
2. 2 番目の実行エラーは、文字列
3 を破棄するときに発生しました。読み取りで受信するようにバッファを変更すると、データが存在しないはずです。実際にはオリジナルの

いいねを押す +0
伊谢尔伦

文字列の C スタイルのアドレスを取得するには、c_str() メンバーが必要で、長さは string.len です

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート