C++読み書きバイナリファイル

1614 ワード

今日はファイルにデータを書き込んで保存するウィジェットを書きます.最初はwrite関数を直接使ってクラスを書き込みましたが、ファイルを読み込むときにいつもエラーが発生していることに気づきました.理解してみると、クラスのstring変数のように、それ自体がオブジェクトであるため、その中で維持されているメモリ領域はスタック上にある(つまりstring内部にポインタメンバーがある).だからofileを通ってwrite((char*)s[i],sizeof(CStudent));オブジェクトをファイルにシーケンス化する行自体が間違っています(ポインタをファイルに書くのに何の役に立ちますか?)
したがって、データの読み書きを行うには、クラスや構造オブジェクトを直接保存することはできません.個別に各データの保存が必要で、読み込むときも別々に読み込みを行います.
#include <stdio.h>
#include<string>
using namespace std;
struct student
{
string name;
string num;
string age;
};
void main()
{
    FILE *fp;
    char *buf, *p;
    int nfileSize;
    char terminator = 0;
    struct student src;
    struct student dst;
    src.name = "nihao";
    src.num = "123456";
    src.age = "18";
    //    
    fp = fopen("data.txt", "wb+");
    fwrite(src.name.c_str(), 1, src.name.length(), fp);
    fwrite(&terminator, 1, 1, fp);
    fwrite(src.num.c_str(), 1, src.num.length(), fp);
    fwrite(&terminator, 1, 1, fp);
    fwrite(src.age.c_str(), 1, src.age.length(), fp);
    fwrite(&terminator, 1, 1, fp);
    fclose(fp);
    //      
    fp = fopen("data.txt", "rb");
    fseek(fp, 0, SEEK_END);
    nfileSize = ftell(fp);
    fseek(fp, 0, SEEK_SET);
    buf = (char*)malloc(nfileSize);
    fread(buf, 1, nfileSize, fp);
    p = buf;
    dst.name = p;
    p = p + strlen(p) + 1;
    dst.num = p;
    p = p + strlen(p) + 1;
    dst.age = p;
    free(buf);
    fclose(fp);
    printf("Name: %s
Num: %s
Age:%s
", dst.name.c_str(), dst.num.c_str(), dst.age.c_str()); }