c++文件流
来源:互联网 发布:复制淘宝首页海报 编辑:程序博客网 时间:2024/05/05 02:40
来源:http://topic.csdn.net/t/20061015/04/5082872.html
文件的概念
在外存上保存的信息以文件形式存放, 每个文件有一个文件名,并存放在某盘的一个确定的目录下。
如: D:/du/abc.dat 是一个文件名的全称。
在C++中文件按存储格式分为两类:文本文件(ASCII文件)和二进制文件。对于字符的输入和输出,文本文件与二进制文件没有区别,但对于数值型的数据,在对文本文件进行I/O 时,要进行格式转换,而二进制文件不需要。如:向文本文件输出 12345 时,由于 12345 是一个整数,在内存中以4个字节的二进制补码格式存放,输出到文本文件时要将每一位数字转换成ASCII码,即 31 32 33 34 35。
在对文件进行I/O时,必须定义一个文件流类的对象,并用该对象打开文件。对于每一个对开的文件,都有一个指向文件中当前位置的指针,打开文件时该指针的开始位置由打开方式决定(默认为0,即起始字节)。在向文件读出或写入信息时,文件指针自动向后移动相应的字节(打于文本文件移动一个字节,对二进制文件由数据类型决定)。当文件指针移到最后,读出的是文件结束符时,文件流对象调用成员函数eof()返回true。
^
|
f 文件指针
在程序中使用文件,必须使用 #include <fstream.h> 命令。
建立文件流对象和打开文件
在打开文件前先建立文件流对象,可以建立ifstream,ofstream 和 fstream类的对象。如:
ifstream fin; //建立输入文件流对象
ofstream fout; //建立输出文件流对象
fstream fio; //建立输入输出文件流对象
打开文件可使用open成员函数,每一个文件件流类都有一个 open 成员函数,其原型为:
void open(const char * fname,int mode);
其中第一个参数 fname 是代表文件件名的字符串,第二个参数 mode 是文件的打开方式,每一位代表一种打开方式 ,在ios基类中用枚举常量表示,如下表:
文件的打开方式
ios::in 文件打开用于数据输入,即从文件中读数据
ios::out 文件打开用于数据输出,即向文件中与数据
ios::ate 打开文件时文件指针指向文件结束位置
ios::app 文件打开用于追加数据,文件指针始终在文件尾
ios::trunc 若打开文件已存在,使之成为空文件
ios::nocreate 若打开文件不存在则不建立,返回打开失败信息
ios::noreplace 打开文件时不能覆盖,若文件存在则返回打开失败信息
ios::binary 打开文件为二进制文件,否则为文本文件
若规定文件的打开方式具有上述的多种拖拉机开方式 时,可用位运算来组合。如:
ios::in|ios::nocreate //文件打开用于数据输入,若打开文件不存在则返回打开失败信息
ios::in|ios::out //文件打开既用于数据输入,又用于输出
ios::app|ios::nocreate //文件打开指针在文件尾,用于追加数据,
//若打开文件不存在则返回打开失败信息
ios::out|ios::noreplace //文件打开用于数据输出,若文件存在则返回打开失败信息
ios::in|ios::out|ios::binary //文件以二进制方式打开,既用于数据输入,又用于输出
如:
例1:
ofstream fout;
fout.open("D://DU//ABC.DAT");
例2:
ifstream fin;
fin.open("a://tz.txt",ios::in|ios::nocreate);
例3:
ofstream fo("c://mxz.dat",ios::app);
if (fo.fail()) {
cerr<<"打开文件失败!"<<endl;
exit(1);
}
例4:
fstream fio("c://sin.dat",ios::in|ios::out|ios::binary);
文本文件的访问操作
1.向文本文件输出数据
向文本文件输出数据有两种方法:
(1)调用从 ostream 流类继承来的插入操作符重载函数,函数原型为:
ostream & operator << (简单类型 &);
(2)调用从 ostream 流类继承来的成员函数 put,函数原型为:
ostream & put(char);
例1:向d:/abc.dat 文件输出 0 - 10 之间的整数:
#include <stdlib.h>
#include <fstream.h>
void main()
{
ofstream fout("d://abc.dat");
if (fout.fail()) { //若打开文件失败
cerr<<"d://abc.dat file not opened !"<<endl;
exit(1)
}
for (int i=0;i<=10;i++) fout <<i<<" ";
fout.close() //关闭 fout 对应的文件
}
例2:把从键盘上输的若干行文字存入d:/tz.txt,键盘输入以 ctrl+Z 结束。
#include <stdlib.h>
#include <fstream.h>
void main()
{
ofstream fout("d://tz.txt");
if (!fout) { //若打开文件失败
cerr<<"File d://tz.txt not open"<<endl;
exit(1);
}
char ch=cin.get();
while(ch!=EOF) {
fout.put(ch);
ch=cin.get;
}
fout.close();
}
2.从文本文件输入数据
从文本文件输入数据到内存有三种方法:
(1)调用从 istream 流类继承来的提取操作符重载函数,函数原型为:
istream & operator >>(简单类型 &);
(2)调用从 istream 流类继承来的成员函数 get() 或 get(char &),函数原型为:
int get();
istream & get(char &);
(3)调用从 istream 流类继承来的成员函数 getline,函数原型为:
istream & getline(char * buffer,int len,char="/n");
例3: 将例子1中建立的d:/abc.dat 中的内容显示出来。
#include <stdlib.h>
#include <fstream.h>
void main()
{
ifstream fin("d://abc.dat");
if (fin.fail()) { //若打开文件失败
cerr<<"d://abc.dat file not opened !"<<endl;
exit(1)
}
int x;
while (fin>>x) cout << x << " ";
fin.close() //关闭 fout 对应的文件
}
程序的运行结果为:
0 1 2 3 4 5 6 7 8 9 10
二进制文件的访问操作
1.向二进制文件输出数据
向二进制文件输出数据有可调用从 ostream 流类提供的成员函数,函数原型为:
ostream & write(const char * buffer ,int len);
利用 ostream 流类提供的seekp成员函数能把输出文件中的文件指针移动到指定位置,函数原型为:
ostream & seekp(long dis,seek_dir ref=ios::beg);
其中 seek_dir 是ios根基类中定义的枚举类型,它有三个常量:ios::beg,ios::cur 和 ios::end,分别代表文件的开始位置,当前位置和结束位置;
dis 是文件移动的字节数,为正表示后移(向结尾方向),为负表示向前移。
例子1:将整型数组 a 中的 45,56,23,87,54,67,78 这几个整数写入到文件d:/intdata.dat中。
#include <stdlib.h>
#include <fstream.h>
void main()
{
ofstream fout("d://intdata.dat",ios::out|ios::binary);
if (!fout) {
cerr<<"File d://intdata.dat open failed!<<endl;
exit(1);
}
int a[]={45,56,23,87,54,67,78};
for (int i=0;i<sizeof(a)/sizeof(a[0]);i++)
fout.write((char *)&a[i],sizeof(a[0]));
fout.close();
}
2.从二进制文件输入数据
从二进制文件输入数据有可调用从 istream 流类提供的成员函数,函数原型为:
istream & read(char * buffer ,int len);
利用 istream 流类提供的seekg成员函数能把输入文件中的文件指针移动到指定位置,函数原型为:
istream & seekg(long dis,seek_dir ref=ios::beg);
例子2:将上例中文件d:/intdata.dat的内容输出。
#include <stdlib.h>
#include <fstream.h>
void main()
{
ifstream fin("d://intdata.dat",ios::in|ios::binary);
if (!fin) {
cerr<<"File d://intdata.dat open failed!<<endl;
exit(1);
}
int x;
while (!fin.eof()) {
fin.read((char *)&x,sizeof(x));
cout << x<< " ";
}
fin.close();
}
- 【C/C++】C++文件流
- 【C/C++】文件流操作
- C 文件流
- C文件流
- c语言文件流
- C读取文件流
- 【C++】 文件输出流
- C++:文件流读写
- C文件流
- C文件输入输出流
- C++IO文件流
- C语言中的文件流
- C语言中的文件流
- C流式文件操作
- C语言的文件流
- C语言中的文件流
- C#FileStream文件流(字符)
- C++(文件和流)
- pb datawindow中使用blob字段
- 嵌入式人才的发展方向
- 一首很回味的词 来自于苏轼
- Http指纹识别技术
- Linux下架设L2TP IPSec VPN服务器 _ 51cto _ 参考
- c++文件流
- xmms播放器加了播放列表的管理功能
- 浅谈HTTP协议(一)--结构
- SQL Server2005 登入 'xxx' 登入失敗。此登入的密碼已經逾期。
- 从事嵌入式软件开发的优缺点
- DAY2|配置C编程环境
- LWUIT 简易漂亮的相册
- vector.resize 与 vector.reserve的区别
- Ubuntu9.04下Oracle手动启动与自启动脚本