首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

C++之文件IO操作流(2)

C++之文件IO操作流(2)

写文件:
复制代码
1 #include "stdafx.h"
2 #include <iostream>
3 #include <fstream>
4 #include <string>
5
6 int main()
7 {
8 //建立对象数组
9     Sprite sprites[3]={
10         Sprite("法师","魔杖"),
11         Sprite("战士","屠龙宝刀"),
12         Sprite("道士","倚天剑")
13     };
14
15 //打开文件
16     std:fstream file("file.dat",std::ios::ate|std::ios::binary);
17 if(!file)
18     {
19         std::cout<<"文件打开失败!";
20         abort();//等同于exit
21     }
22
23 //写文件
24 for(int i=0;i<3;i++)
25         file.write((char*) &sprites[i],sizeof(sprites[i]));
26
27 //关闭文件
28     file.close();
29
30 return0;
31 }
复制代码
读文件file.dat:
复制代码
1 #include "stdafx.h"
2 #include <iostream>
3 #include <fstream>
4 #include <string>
5
6 int main()
7 {
8 //建立对象数组
9     Sprite rsprites[3];
10
11 //打开文件
12     std::ifstream rfile("file.dat",std::ios::binary);
13 if(!rfile)
14     {
15         std::cout<<"文件打开失败!";
16 return1;//等同于exit
17     }
18
19 //读文件
20 for(int i=0;i<3;i++)
21     {
22         rfile.read((char*) &rsprites[i],sizeof(rsprites[i]));
23         rsprites[i].showSprite();
24     }
25
26 //关闭文件
27     rfile.close();
28
29 return0;
30 }
复制代码
读出显示字符:
在read函数还是write函数里都要把数据转化为char*类型,代码中sizeof函数是用于确定要读入读出的字节数。
  在文件结束处有个标志位EOF,在用文件流读取文件时,使用成员函数eof()(函数原型:int eof())可以检测到结束符。如果该函数返回值为非零,则表示到达文件末尾。返回零则表示未达到文件末尾。
  (3)前面所介绍的文件都是按顺序来读取的的,C++中又提供了针对于文件读写指针的相关成员函数,使得我们可以在IO流中随意移动文件指针,从而对文件的进行随机地读写。类istream针对读指针提供3个成员函数:
  tellg()//返回输入文件读指针的当前位置;
  seekg(文件中的位置)//将输入文件中的读指针移动到指定位置
  seekg(位移量,参照位置)//以参照位置为基准移动若干字节
其中参照位置是枚举值:
beg//从文件开头计算要移动的字节数
cur//从文件指针的当前位置计算要移动的字节数
end//从文件的末尾计算要移动的字节数
如果参照位置省略,则默认为beg。而类ostream针对写指针提供的3个成员函数:
  tellp()//返回输出文件写指针的当前位置;
  seekp(文件中的位置)//将输出文件中的写指针移动到指定位置
  seekp(位移量,参照位置)//以参照位置为基准移动若干字节
现在我对上一示例中读取二进制文件代码稍作更改:
复制代码
1 #include "stdafx.h"
2 #include <iostream>
3 #include <fstream>
4 #include <string>
5
6 int main()
7 {
8 //建立对象数组
9     Sprite rsprites[3];
10
11 //打开文件
12     std::ifstream rfile("file.dat",std::ios::binary);
13 if(!rfile)
14     {
15         std::cout<<"文件打开失败!";
16 return1;//等同于exit
17     }
18
19 //读文件
20 for(int i=0;i<3;i++)
21     {
22         rfile.read((char*) &rsprites[i],sizeof(rsprites[i]));
23         rsprites[i].showSprite();
24     }
25
26     Sprite rsprite;//建立对象
27
28     std::cout<<"改变读取顺序:"<<std::endl;
29     rfile.seekg(sizeof(Sprite)*2,std::ios::beg);//读取精灵道士信息
30     rfile.read((char*) &rsprite,sizeof(Sprite));
31     rsprite.showSprite();
32     
33     rfile.seekg(-int(sizeof(Sprite)*2),std::ios::end);//读取精灵战士信息
34     rfile.read((char*) &rsprite,sizeof(Sprite));
35     rsprite.showSprite();
36
37     rfile.seekg(-int(sizeof(Sprite)*2),std::ios::cur);//读取精灵法师信息
38     rfile.read((char*) &rsprite,sizeof(Sprite));
39     rsprite.showSprite();
40
41 //关闭文件
42     rfile.close();
43
44 return0;
45 }
继承事业,薪火相传
返回列表