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());
}