C++读写二进制文件
2016-03-12 16:51
330 查看
今天写一个小程序,本意是写入数据到文件中保存起来。起初直接使用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\nNum: %s\nAge:%s\n", dst.name.c_str(), dst.num.c_str(), dst.age.c_str());
}
因此如果要进行数据读写,直接保存类、结构对象是行不通的。需要单独各数据的保存,读取的时候也分别进行读入。
#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());
}
相关文章推荐
- VC++2005 使用调用webserver ,使用MSXML读取XML文件
- 《你必须知道的495个C语言问题》读书笔记之第8-10章:字符串、布尔类型和预处理器
- 软件工程课程作业(二)--四则运算2改进版(c++)
- HDOJ 1087Super Jumping! Jumping! Jumping!解题报告
- C语言实现四则运算
- VC++程序开机自动启动
- STL 容器特点简单总结
- 编写C++程序使DirectShow进行视频捕捉
- 链表(list)的实现(c语言)
- C++ Primer 5th - 1.1 编写一个简单的C++程序
- C/C++基础知识(一)数组和指针
- (各个公司面试原题)在线做了一套CC++综合測试题,也来測一下你的水平吧(二)
- C++第1-1次上机实验
- C语言中a=b=c,a=b==c,a==(b=c),a==(b==c)的简单分析
- 详解C++循环创建多级目录及判断目录是否存在的方法
- C++第一次实验—2
- C++ auto类型说明符
- C++ auto类型说明符
- C++ 单例模式实现代码
- C++开源库