第 23讲 文件 输入和输出教学目的和要求:
了解使用文件输入输出的过程 。
掌握文件的打开和关闭及文件的读写 。
教学内容提要:
1,文件的打开和关闭;
2,文件的读写;
教学重点:文件的打开和关闭及文件的读写 。
教学难点:文件的打开和关闭及文件的读写 。
教学进度,P261~P274
教学过程:
23.1 文件的打开与关闭
1.文件的打开为了对一个文件进行读写操作,应先
“打开”该文件 ;在使用结束后,则应
“关闭”文件。在 C++中,打开一个文件,就是将这个文件与一个流建立关联 ;
关闭一个文件,就是取消这种关联。
要执行文件的输入输出,须做三件事,
(1) 在程序中包含头文件 fstream.h;
(2) 建立流。建立流的过程就是定义流类的对象,例如,
ifstream in;
ofstream out;
fstream both;
分别定义了输入流对象 in;输出流对象 out,输入输出流对象 both。
(3) 使用 open()函数打开文件,也就是使某一文件与上面的某一流相联系。 open()函数是上述三个流类的成员函数,其原型是在 fstream.h中定义的,原型为,
void open(const unsigned char*,int mode,int
access=filebuf::openprot);
说明:
1),filename是文件名字,它可包含路径说明 。
2),mode说明文件打开的模式,它对文件的操作影响重大,
mode的取值必须是以下值之一:
ios::in 打开文件进行读操作
ios::out 打开文件进行写操作
ios::ate 打开时文件指针定位到文件尾
ios::app 添加模式,所有增加都在文件尾部进行
ios::trunc 如果文件已存在则清空原文件
ios::nocreate 如果文件不存在则打开失败
ios::noreplace 如果文件存在则打开失败
ios::binary 二进制文件 ( 非文本文件 )
对于 ifstream流,mode的默认值为 ios::in;对于 ofstream流
,mode的默认值为 ios::out。
3),prot决定文件的访问方式,取值为:
0 普通文件 1 只读文件
2 隐含文件 4 系统文件一般情况下,该访问方式使用默认值。
2.文件的关闭在使用完一个文件后,应该把它关闭。
所谓关闭,实际上就是使打开的文件与流
“脱钩”。关闭文件可使用 close()函数完成,
close()函数也是流类中的成员函数,它不带参数,不返回值。 例如,
将关闭与流 out相联接的文件。
23.2 文件的读写
1,文件读写方法
( 1)使用流运算符直接读写。
文件的读 /写操作可以直接使用流的插入运算符,<<”
和提取运算符,>>”,这些运算符将完成文件的字符转换工作。
( 2)使用流成员函数常用的输出流成员函数为,put函数,write函数、输出流随机访问函数有 seekp和 tellp。
常用的输入流成员函数如下,get函数,getline函数、
read函数,输入流随机访问函数有 seekg和 tellg。
例 23.9 把一个整数、一个浮点数和一个字符串写到磁盘文件 test中。
#include<fstream.h>
int main()
{
ofstream fout;
fout.open("test");
if (!fout)
{ cout<<"Cannot open output file\n,";
return 1;
}
fout<<10<<" "<<123.456<<"\t" <<“This is a text file.\n";
fout.close();
return 0;
}
2.二进制文件的读写二进制文件不同于文本文件,它可用于任何类型的文件
( 包括文本文件 ),读写二进制文件的字符不作任何转换,
读写的字符与文件之间是完全一致的 。
(1) 用 get()函数和 put()函数读写二进制文件
get()函数有许多格式,其中最常用的版本原型如下,
istream& get(char& ch);
get()函数从相关流中只读一个字节,并把该值放入 ch中并返回该流,当到达文件尾时,使该流的值为 0。
put()函数的原型如下,
ostream& put(char ch);
put()函数将 ch写入流中并返回该流。
例 23.11 将 ‘ a’ 至 ‘ z’ 的 26个英文字母写入文件,而后从该文件中读出并显示出来 。
#include<iostream.h>
#include<fstream.h>
void test_write()
{ ofstream fs;
fs.open("d:\\test.dat");
int i;
char c='a';
for (i=0;i<26;i++){ fs.put(c); c++; }
fs.close()
}
void test_read()
{ ifstream fs("d:\\test.dat");
char c;
while(fs.get(c)) cout<<c;
fs.close()
}
void main()
{ test_write(); test_read(); }
(2) 用 read()函数和 write()函数读写二进制文件
read()和 write()原型如下,
istream &read(unsigned char* buf,int num);
ostream &write(const unsigned char* buf,int
num);
例 23.12 用 write()函数向文件 test中写入整数与双精度数 。
#include<iostream.h>
#include<fstream.h>
#include<string.h>
main()
{ ofstream out("test");
if (!out)
{ cout<<"Cannot open output file.\n"; return 1;
}
int i=12340;
double num=100.45;
out.write((char *) &i,sizeof(int));
out.write((char *) &num,sizeof(double));
out.close();
return 0;
}
3 检测文件结束在文件结束的地方有一个标志位,记为 EOF(End
OF)。采用文件流方式读取文件时,使用成员函数 eof(),
可以检测到这个结束符。如果该函数的返回值非零,
表示到达文件尾。为零表示未到达文件尾。该函数的原型是,
int eof();
函数 eof()的用法示例如下,
ifstream ifs;

if (!ifs.eof()) //尚未到达文件尾

4 文件的随机读写在 C++的 I/O系统中有个文件指针,它有两个名字。
其中一个名字叫 get指针,用于指出下一次输入操作的位置 ;
另一个名字叫做 put指针,用于指出下一次输出操作的位置。
例 23.14 将文件 test中第五个字符修改成 X。
#include<iostream.h>
#include<fstream.h>
void main(void)
{ fstream fs;
fs.open("d:\\test",ios::in| ios::out); //以读写方式打开文件
if (!fs)
cout<<"open file errer!";
else
{ fs.seekp(4,ios::beg); // 设置写指针
fs.put('X');
char contents[10];
fs.seekg(0,ios::beg); // 设置读指针
fs.get(contents,10);
cout<<contents;
}
}
#include<iostream.h>
#include<fstream.h>
#include<string.h>
class massage
{ public:
int num;
char* name;
int age;
char sex;
char *address;
massage(){}
massage(int n)
{ num=n;
name=new char[20];
address=new char[40];
cout<<"enter all message\n";
cin>>name>>age>>sex>>address;
}
void print()
{ cout<<num<<"\t"<<name
<<"\t"<<age<<"\t"<<sex<<
"\t"<<address<<endl;
}
};
void main()
{ ofstream fout;
fout.open("d:\\text.txt",ios::out);
for(int i=0;i<3;i++)
{ massage obj(i+1);
fout.write((char*)(&obj),sizeof(massage));
}
fout.close();
ifstream fin;
fin.open("d:\\text.txt",ios::in);
for(int j=0;j<3;j++)
{ massage obj;
fin.read((char*)(&obj),sizeof(massage));
obj.print();
}
cout<<"search message\n"<<endl;
for(int k=0;k<3;k++)
{ massage obj;
int offs=sizeof(massage)*k;
fin.seekg(offs,ios::beg);
fin.read((char*)(&obj),sizeof(massage));
if(strcmp(obj.name,"zhang")==0)
cout<<obj.num<<"\t"<<obj.name<<"\t“
<<obj.age<<"\t"<<obj.sex<<"\t“
<<obj.address<<endl;
}
fin.close();
}
小结:
1、文件打开与关闭
2、文件的顺序读写
3、文件的随机读写作业: