c++中文件的操作

本文引用了大量http://blog.csdn.net/mynote/article/details/401648中的内容。

C++中的文件操作

在C++中,类ifstream,ofstream和fstream是处理有关文件I/O的。引用这三个类均要在头文件fstream.h内申明,如果程序涉及到对文件的操作必须加头文件:

#include <fstream.h>
一.文件的打开

在上述三个类中,均具有成员函数open(),其函数原型为:void open( char* filename,int mode,int access);

参数:

filename : 要打开的文件名
mode : 要打开文件的方式
access: 打开文件的属性
打开文件的方式在类ios中定义的,常见的打开方式有:

ios::app: 以追加的方式打开文件
ios::ate: 文件打开后定位到文件尾, ios:app 就包含有此属性
ios::binary: 以二进制方式打开文件,缺省的方式是文本方式。两种方式的区别见前文
ios::in : 文件以输入方式打开
ios::out : 文件以输出方式打开
ios::nocreate: 不建立文件,所以文件不存在时打开失败
ios::noreplace:不覆盖文件,所以打开文件时如果文件存在失败
ios::trunc : 如果文件存在,把文件长度设为0

打开方式可以使用多种方式复合("|"逻辑),如以二进制形式以输出方式打开,则打开方式为ios::out|ios::binary

打开文件的属性取值:


取值含义
0一般文件,(缺省值)
1只读文件
2隐藏文件
4系统文件
  

同样可以用逻辑词连接以上属性如:1|2表示以只读方式打开隐藏文件。

       如果open 函数只有文件名一个参数,则是以读/写普通文件打开,即:file1.open("c:config.sys");<=>f ile1.open("c:config.sys",ios::in|ios::out,0);

特别提出的是, fstream 有两个子类: ifstream(input file stream) 和ofstream(outpufile stream) ,ifstream 默认以输入方式打开文件,而ofstream 默认以输出方式打开文件。

ifstream file2("c:pdos.def ");// 以输入方式打开文件ofstream file3("c:x.123");//以输出方式打开文件  

二.文件的关闭

  打开的文件使用完成后一定要关闭, fstream 提供了成员函数close()来完成此操作,如:file1.close();就把file1 相连的文件关闭。时刻牢记,文件的操作都是成对出现的 。

三.文件的读写

文件的读写分为两种:文本读写和二进制读写,显然,读写文件之前都要首先打开文件。顺便说一句,如果要打开的文件并不存在,会自动生成一个空文件。

打开方式:方式1.  先申明类,再打开。 ofstream::open() ;fout.open("output.txt");方式2.直接以构造函数形式打开文件。ofstream fout("output.txt");  

3.1 文本文件的读写

void main()
{//新建空文件-----
ofstream Savefile("C:\\Users\\Administrator\\Desktop\\C++\\fileread2\\file3.txt");
//以文本方式追写
ofstream SaveFile("file3.txt", ios::ate);    
char s[]="C++ is a powerful language;";
for(unsigned int i=0;i<strlen(s);i++)
{SaveFile << s[i];}
SaveFile.close();
//输出
char ch;
ifstream outfile("file3.txt");
	if(!outfile)
	{
		cout<<"you can not open the file"<<endl;
		exit(1);
	}
	while(outfile)
	{
	 outfile.get(ch);
	 cout<<ch;
	}
	outfile.close();

}
3.2二进制文件的读写

二进制文件的读写比文本文件的读写要复杂,我们不再使用cout<<和cin>>输入输出,否则读写的是文本文件。我们使用get()函数put()函数以及read()和write()函数进行二进制文件的读写。其中get()和put都是针对读写一个字节。而read()和write。以下分别为读写字节和数据块的例子。函数write()和read() 有两个参数。第一个是指向对象的char 类型的指针, 第二个是对象的大小。如int number = 30; fout.write((char *)(&number), sizeof(number));

put()函数向流写入一个字符,其原型是ofstream &put(char ch),使用也比较简单, 如file1.put('c'); 就是向流写一个字符'c'。
get()函数比较灵活,有3 种常用的重载形式:一种就是和put()对应的形式: ifstream &get(char &ch);功能是从流中读取一个字符,结果保存在引用ch 中,如果到文件尾,返回空字符。如file2.get(x); 表示从文件中读取一个字符,并把读取的字符保存在x 中。另一种重载形式的原型是: int get();这种形式是从流中返回一个字符,如果到达文件尾,
返回EOF,如x=f ile2.get();和上例功能是一样的。还有一种形式的原型是:ifstream &get(char *buf,int num,char delim='n') ;这种形式把字符读入由buf 指向的数组,直到读入了num 个字符或遇到了由delim 指定的字符,如果没使用delim 这个参数,将使用缺省值换行符'n'。例如:file2.get(str1,127,'A');//从文件中读取字符到字符串str1,当遇到字符'A'或读取了127个字符时终止。
要读写二进制数据块,使用成员函数read()和write()成员函数,它们原型如下:
read(unsigned char *buf,int num);
write(const unsigned char *buf,int num);
read()从文件中读取num 个字符到buf 指向的缓存中,如果在还未读入num 个字符时就到了文件尾,可以用成员函数int gcount();来取得实际读取的字符数;而write() 从buf指向的缓存写num 个字符到文件中,值得注意的是缓存的类型是unsigned char *,有时可能需要类型转换。

#include <fstream.h>
void main()
{
fstream File("test_file.txt",ios::out | ios::in | ios::binary);
char ch;
ch='o';
File.put(ch); // 将ch 的内容写入文件
File.seekg(ios::beg); // 定位至文件首部
File.get(ch); // 读出一个字符
cout << ch << endl; // 将其显示在屏幕上
File.close();
}
#include <fstream.h>
#include <string.h>
void main()
{
fstream File("test_file.txt",ios::out | ios::in | ios::binary);
char arr[13];
strcpy(arr,"Hello World!"); //将Hello World!存入数组
File.write(arr,5); // 将前5 个字符——"Hello"写入文件
File.seekg(ios::beg); // 定位至文件首部
static char read_array[10]; // 在此我将打算读出些数据
File.read(read_array,3); // 读出前三个字符——"Hel"
cout << read_array << endl; // 将它们输出
File.close();
}
四.检测EOF

成员函数eof()用来检测是否到达文件尾,如果到达文件尾返回非0 值,否则返回0。原型是int eof();例: if(in.eof ())ShowMessage(" 已经到达文件尾!");

五.文件定位

和C 的文件操作方式不同的是,C++ I/O 系统管理两个与一个文件相联系的指针。一个是读指针,它说明输入操作在文件中的位置;另一个是写指针,它下次写操作的位置。每次执行输入或输出时,相应的指针自动变化。所以, C++ 的文件定位分为读位置和写位置的定位,对应的成员函数是seekg()和seekp(),seekg()是设置读位置,seekp 是设置写位置。它们最通用的形式如下:

istream &seekg(streamof f offset,seek_dir origin);
ostream &seekp(streamof f offset,seek_dir origin);

streamof f 定义于iostream.h 中,定义有偏移量offset 所能取得的最大值, seek_di r表示移动的基准位置,是一个有以下值的枚举:

ios::beg: 文件开头
ios::cur: 文件当前位置
ios::end : 文件结尾
这两个函数一般用于二进制文件,因为文本文件会因为系统对字符的解释而可能与预想的值不同。例:
file1.seekg(1234,ios::cur);//把文件的读指针从当前位置向后移1234 个字节
file2.seekp(1234,ios::beg);//把文件的写指针从文件开头向后移1234 个字节









  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值