c++中如何向二进制文件读写含有string类型的结构体变量

比如:#include<string>structstudent{stringname;stringnum;stringage;};... 比如:
#include<string>
struct student
{
string name;
string num;
string age;
};
展开
 我来答
花花浪客
推荐于2016-10-24 · TA获得超过2070个赞
知道小有建树答主
回答量:792
采纳率:100%
帮助的人:796万
展开全部

代码样例:

#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\nNum: %s\nAge:%s\n", dst.name.c_str(), dst.num.c_str(), dst.age.c_str());
}

执行结果:

tattackor
推荐于2016-07-28 · TA获得超过3.5万个赞
知道大有可为答主
回答量:5083
采纳率:94%
帮助的人:1058万
展开全部


C语言把一个结构体数组写入文件分三步:

1、以二进制写方式(wb)打开文件

2、调用写入函数fwrite()将结构体数据写入文件

3、关闭文件指针

相应的,读文件也要与之匹配:

1、以二进制读方式(rb)打开文件

2、调用读文件函数fread()读取文件中的数据到结构体变量

3、关闭文件指针

参考代码如下:

#include<stdio.h>
struct stu {
    char name[30];
    int age;
    double score;
};
int read_file();
int write_file();
int main()
{
    if ( write_file() < 0 ) //将结构体数据写入文件
        return -1;
    read_file(); //读文件,并显示数据
    return 0;
}
int write_file()
{
    FILE *fp=NULL;
    struct stu student={"zhang san", 18, 99.5};
    fp=fopen( "stu.dat", "wb" ); //b表示以二进制方式打开文件
    if( fp == NULL ) //打开文件失败,返回错误信息
    {
        printf("open file for write error\n");
        return -1;
    }
    fwrite( &student, sizeof(struct stu), 1, fp ); //向文件中写入数据
    fclose(fp);//关闭文件
    return 0;
}
int read_file()
{
    FILE *fp=NULL;
    struct stu student;
    fp=fopen( "stu.dat", "rb" );//b表示以二进制方式打开文件
    if( fp == NULL ) //打开文件失败,返回错误信息
    {
        printf("open file for read error\n");
        return -1;
    }
    fread( &student, sizeof(struct stu), 1, fp ); //读文件中数据到结构体
    printf("name=\"%s\" age=%d score=%.2lf\n", student.name, student.age, student.score ); //显示结构体中的数据
    fclose(fp);//关闭文件
    return 0;
}


 fwrite(const void*buffer,size_t size,size_t count,FILE*stream);   

(1)buffer:指向结构体的指针(数据首地址)   
(2)size:一个数据项的大小(一般为结构体大小)
(3)count: 要写入的数据项的个数,即size的个数   
(4)stream:文件指针。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
ycsxm
2013-05-17 · TA获得超过3.3万个赞
知道大有可为答主
回答量:1.4万
采纳率:0%
帮助的人:8591万
展开全部
这string 保存的如果是串地址就麻烦了;
我用的C++BUILDER好象不支持string,
否则,邦你试一下了。
更多追问追答
追问
串地址是啥?
难道说很难办,不能成块地读写?
貌似string有个.stu_t()返回地址
追答
C++BUILDER6支持标准串的
#include
using namespace std;
string s="中华人民共和国322222222222222222222222“;
不管串s有多长,但sizeof(s)总是24,象是一个对象结构;
如果在结构中用string,可能只是一个对象参数而已。
楼主采纳的例子,与struct student 是毫无关系的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
yyjie999
2013-05-17 · TA获得超过199个赞
知道小有建树答主
回答量:197
采纳率:100%
帮助的人:194万
展开全部
#include <fstream>
using namespace std;

int main() {
student s;
s.name = "name";
ofstream of("output.txt");
of<<s.name<<endl;
of.close();
return 0;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式