ofstream 和ifstream的具体用法.docx

上传人:b****8 文档编号:10526781 上传时间:2023-02-21 格式:DOCX 页数:15 大小:21.39KB
下载 相关 举报
ofstream 和ifstream的具体用法.docx_第1页
第1页 / 共15页
ofstream 和ifstream的具体用法.docx_第2页
第2页 / 共15页
ofstream 和ifstream的具体用法.docx_第3页
第3页 / 共15页
ofstream 和ifstream的具体用法.docx_第4页
第4页 / 共15页
ofstream 和ifstream的具体用法.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

ofstream 和ifstream的具体用法.docx

《ofstream 和ifstream的具体用法.docx》由会员分享,可在线阅读,更多相关《ofstream 和ifstream的具体用法.docx(15页珍藏版)》请在冰豆网上搜索。

ofstream 和ifstream的具体用法.docx

ofstream和ifstream的具体用法

ofstream和ifstream的具体用法

ofstream是从内存到硬盘,ifstream是从硬盘到内存,其实所谓的流缓冲就是内存空间;

在C++中,有一个stream这个类,所有的I/O都以这个“流”类为基础的,包括我们要认识的文件I/O,stream这个类有两个重要的运算符:

1、插入器(<<)

  向流输出数据。

比如说系统有一个默认的标准输出流(cout),一般情况下就是指的显示器,所以,cout<<"WriteStdout"<<'\n';就表示把字符串"WriteStdout"和换行字符('\n')输出到标准输出流。

2、析取器(>>)

  从流中输入数据。

比如说系统有一个默认的标准输入流(cin),一般情况下就是指的键盘,所以,cin>>x;就表示从标准输入流中读取一个指定类型(即变量x的类型)的数据。

  在C++中,对文件的操作是通过stream的子类fstream(filestream)来实现的,所以,要用这种方式操作文件,就必须加入头文件fstream.h。

下面就把此类的文件操作过程一一道来。

一、打开文件

  在fstream类中,有一个成员函数open(),就是用来打开文件的,其原型是:

voidopen(constchar*filename,intmode,intaccess);

参数:

filename:

  要打开的文件名

mode:

    要打开文件的方式

access:

   打开文件的属性

打开文件的方式在类ios(是所有流式I/O类的基类)中定义,常用的值如下:

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:

系统文件

  可以用“或”或者“+”把以上属性连接起来,如3或1|2就是以只读和隐含属性打开文件。

  例如:

以二进制输入方式打开文件c:

\config.sys

fstreamfile1;

file1.open("c:

\\config.sys",ios:

:

binary|ios:

:

in,0);

  如果open函数只有文件名一个参数,则是以读/写普通文件打开,即:

file1.open("c:

\\config.sys");<=>file1.open("c:

\\config.sys",ios:

:

in|ios:

:

out,0);

  另外,fstream还有和open()一样的构造函数,对于上例,在定义的时侯就可以打开文件了:

fstreamfile1("c:

\\config.sys");

  特别提出的是,fstream有两个子类:

ifstream(inputfilestream)和ofstream(outpufilestream),ifstream默认以输入方式打开文件,而ofstream默认以输出方式打开文件。

ifstreamfile2("c:

\\pdos.def");//以输入方式打开文件

ofstreamfile3("c:

\\x.123");//以输出方式打开文件

  所以,在实际应用中,根据需要的不同,选择不同的类来定义:

如果想以输入方式打开,就用ifstream来定义;如果想以输出方式打开,就用ofstream来定义;如果想以输入/输出方式来打开,就用fstream来定义。

二、关闭文件

  打开的文件使用完成后一定要关闭,fstream提供了成员函数close()来完成此操作,如:

file1.close();就把file1相连的文件关闭。

三、读写文件

  读写文件分为文本文件和二进制文件的读取,对于文本文件的读取比较简单,用插入器和析取器就可以了;而对于二进制的读取就要复杂些,下要就详细的介绍这两种方式

  1、文本文件的读写

  文本文件的读写很简单:

用插入器(<<)向文件输出;用析取器(>>)从文件输入。

假设file1是以输入方式打开,file2以输出打开。

示例如下:

  file2<<"ILoveYou";//向文件写入字符串"ILoveYou"

  inti;

  file1>>i;//从文件输入一个整数值。

  这种方式还有一种简单的格式化能力,比如可以指定输出为16进制等等,具体的格式有以下一些

操纵符功能输入/输出

dec格式化为十进制数值数据输入和输出

endl输出一个换行符并刷新此流输出

ends输出一个空字符输出

hex格式化为十六进制数值数据输入和输出

oct格式化为八进制数值数据输入和输出

setpxecision(intp)设置浮点数的精度位数输出

  比如要把123当作十六进制输出:

file1<

file1<

  2、二进制文件的读写

①put()

  put()函数向流写入一个字符,其原型是ofstream&put(charch),使用也比较简单,如file1.put('c');就是向流写一个字符'c'。

②get()

  get()函数比较灵活,有3种常用的重载形式:

  一种就是和put()对应的形式:

ifstream&get(char&ch);功能是从流中读取一个字符,结果保存在引用ch中,如果到文件尾,返回空字符。

如file2.get(x);表示从文件中读取一个字符,并把读取的字符保存在x中。

  另一种重载形式的原型是:

intget();这种形式是从流中返回一个字符,如果到达文件尾,返回EOF,如x=file2.get();和上例功能是一样的。

  还有一种形式的原型是:

ifstream&get(char*buf,intnum,chardelim='\n');这种形式把字符读入由buf指向的数组,直到读入了num个字符或遇到了由delim指定的字符,如果没使用delim这个参数,将使用缺省值换行符'\n'。

例如:

  file2.get(str1,127,'A');//从文件中读取字符到字符串str1,当遇到字符'A'或读取了127个字符时终止。

③读写数据块

  要读写二进制数据块,使用成员函数read()和write()成员函数,它们原型如下:

    read(unsignedchar*buf,intnum);

    write(constunsignedchar*buf,intnum);

  read()从文件中读取num个字符到buf指向的缓存中,如果在还未读入num个字符时就到了文件尾,可以用成员函数intgcount();来取得实际读取的字符数;而write()从buf指向的缓存写num个字符到文件中,值得注意的是缓存的类型是unsignedchar*,有时可能需要类型转换。

例:

    unsignedcharstr1[]="ILoveYou";

    intn[5];

    ifstreamin("xxx.xxx");

    ofstreamout("yyy.yyy");

    out.write(str1,strlen(str1));//把字符串str1全部写到yyy.yyy中

    in.read((unsignedchar*)n,sizeof(n));//从xxx.xxx中读取指定个整数,注意类型转换

    in.close();out.close();

四、检测EOF

  成员函数eof()用来检测是否到达文件尾,如果到达文件尾返回非0值,否则返回0。

原型是inteof();

例:

  if(in.eof())ShowMessage("已经到达文件尾!

");

五、文件定位

  和C的文件操作方式不同的是,C++I/O系统管理两个与一个文件相联系的指针。

一个是读指针,它说明输入操作在文件中的位置;另一个是写指针,它下次写操作的位置。

每次执行输入或输出时,相应的指针自动变化。

所以,C++的文件定位分为读位置和写位置的定位,对应的成员函数是seekg()和seekp()。

seekg()是设置读位置,seekp是设置写位置。

它们最通用的形式如下:

    istream&seekg(streamoffoffset,seek_dirorigin);

    ostream&seekp(streamoffoffset,seek_dirorigin);

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

ios:

:

beg:

  文件开头

ios:

:

cur:

  文件当前位置

ios:

:

end:

  文件结尾

  这两个函数一般用于二进制文件,因为文本文件会因为系统对字符的解释而可能与预想的值不同。

例:

   file1.seekg(1234,ios:

:

cur);//把文件的读指针从当前位置向后移1234个字节

   file2.seekp(1234,ios:

:

beg);//把文件的写指针从文件开头向后移1234个字节

ofstreamifstream文件操作

////////////////////////////////////////////////////

2009-11-1511:

18转自

c中输出和输入导屏幕和键盘的类别声明包含再标题文件中,而磁盘类文件的I/O则声明再包含标题文件内。

输入和输出格式:

输出到磁盘ofsteam识别字(“文件名”)

从磁盘读文件ifsteam识别字("文件名“)

例如:

ofstreamoutfile("data.txt");//写入到磁盘的data.txt中

格式化输入输出:

1整数数据的输入输出

整数数据存储再磁盘内,每个文字各占一个字节。

例如:

#include

#include

#inlude

voidmain()

{

ofstreamoutfile("data.txt");//写入文件

for(inti=0;i<10;i)

outfile<

cout<<"ok,pressakey!

";

gerch();

}

程序执行后用记事本打开可以看到数据

0123456789

同样读取文件语句为:

intdata;

ifstreaminfile("data.txt");

for(inti=0;i<10;i)

{

infile>>data;//读数据的时候因为数据间有一个空格才能完整的读出,

cout<

}

2字符数据的输入

字符的输出方式以put(ch)为存入语句,读取语句为get(ch)

例如:

charstr[]="hellothisisacprograme!

n"

"iknowthisdifferencen"

"andmocive";

ofstreamoutfile("data.txt");

for(inti=0;i

outfile.put(str[i]);

读取:

charch;

ifstreaminfile("data.txt");

while(infile)

{

infile.get(ch);

cout<

}

getch();

}

3字符串数据的输入

数据多的时候读写速度比较快,输入时以整行字符串加上换行符号一次写入。

读取的时候以语句getline(buffer,max),来读取整行数据,直到遇到换行符,每行结尾的n并不读入,所以在输出的时候需要加上换行符号,否则数据会连接在一起。

例子:

ofstreamoutfile("strdata.txt");

outfile<<"useyourvoten";

outfile<<"ouseyourweisen";

读取:

constMAX=80;

charbuffer[MAX];

ifstreaminfile("strdata.txt");

while(infile)

{

infile.getline(buffer,MAX);

cout<

}

4浮点数

浮点数因为有小数点,在存储数据时与整数相同,只要每个数据加上一个空格就可以区隔相邻的数据

6二进制文件

上述的格式化文件比较占用硬盘控件,采用二进制存储就可以节约很多空间。

它使用write,read()来存储和读取。

ofstream识别字(”文件名“,ios:

:

binary);

write(写入地址,写入大小)

ifstream识别字(”文件名“,ios:

binary);

识别字.read(读取地址,读取大小);

例如:

infile.read((char*)buffer,sizeof(数据类型));

关闭文件

识别字.close();

例子:

ofstreamoutfile("data.dat",ios:

:

binary);

for(inti=0;i<100;i)

{

n[0]=i1;

outfile.write((Char*)n,sizeof(int));//还可以用变量和数组为例

//outfile.write((Char*)&i,sizeof(int));i为变量

//outfile.write((Char*)n,sizeof(int));n为数组

}

outfile.close();

ifstreaminifile("data.dat",ios:

binary);

for(i=0;i<100;i)

{inifile.read((Char*)n,sizeof(int);

cout<

}

********************

read()从文件中读取num个字符到buf指向的缓存中,如果在还未读入num个字符时就到了文件尾,可以用成员函数intgcount();来取得实际读取的字符数;而write()从buf指向的缓存写num个字符到文件中,值得注意的是缓存的类型是unsignedchar*,有时可能需要类型转换。

例:

    unsignedcharstr1[]="ILoveYou";

    intn[5];

    ifstreamin("xxx.xxx");

    ofstreamout("yyy.yyy");

    out.write(str1,strlen(str1));//把字符串str1全部写到yyy.yyy中

    in.read((unsignedchar*)n,sizeof(n));//从xxx.xxx中读取指定个整数,注意类型转换

    in.close();out.close();

********************

7随机存取文件

文件能够随意读出,读出后又可以更新,更新后可以回存到源文件内。

fstreamfile;

file.open("文件名",存取模式);

file.open("x.dat",ios:

:

app|ios:

:

in|ios:

:

out|ios:

:

binary);

in打开文件输入或者读取ifstream

out打开文件输出或者写入ofstream

ate从文件尾开始写入或者读取

app加在文件尾

arunc若文件存在,讲其长度设为0

binary打开二进制文件

二进制文件中有一个指针,指向当前数据在文件中的位置,这个文件指针和一般的指针变量不一样,它只是一个纯粹的指示器。

函数介绍

seekg()

seekg(0)指针移到文件的最前面

seekg(0,ios:

:

cur);把当前的指针当作0

seekg(0,ios:

:

end);将指针移到文件尾,若再配合file.tellg()则可以求出文件的大小为多少bytes

以下两个操作都必须在文件关闭后才可以使用

remove("文件名”);把这个文件删除

rename("旧文件名","新文件名");

#include

#include

usingnamespacestd;

intmain()

{

intn[5]={1,2,3,4,5};

registerinti;

ofstreamout("test",ios:

:

out|ios:

:

binary);

if(!

out){

cout<<"Cannotopenfile.n";

return1;

}

out.write((char*)&n,sizeofn);

out.close();

for(i=0;i<5;i)//cleararray

n[i]=0;

ifstreamin("test",ios:

:

in|ios:

:

binary);

if(!

in){

cout<<"Cannotopenfile.n";

return1;

}

in.read((char*)&n,sizeofn);

for(i=0;i<5;i)//showvaluesreadfromfile

cout<

in.close();

return0;

}

8.检测EOF

  成员函数eof()用来检测是否到达文件尾,如果到达文件尾返回非0值,否则返回0。

原型是inteof();

例:

  if(in.eof())ShowMessage("已经到达文件尾!

");

ifstream和ofstream是fstream.h头文件中的类,所以在使用这两个类的时候一定要加入#include

总体说一下:

ifstream的作用是从文件中读出,ofstream是写入向文件写入数据,他们的构造函数是:

ofstream:

:

ofstream(constchar*filename,intmode=ios:

:

out,intopenprot=filebuf:

:

openprot);ifstream与此类似。

Filename,是文件名称,用“”括起来,如果是本目录下则只需写上文件名字,不需要写文件路径;mode是打开方式,一般情况我们默认即可;openprot是属性,一般也是默认。

下面用三个例子说明:

一,写入数字

ofstreamwritefile("3.txt");//定义对象,往文件写数据

if(writefile)//检查文件是否打开,如果打开则写数据

{

writefile<<"0123456789";

}

ifstreamreadfile("3.txt");//定义对象,读取数据

intdate;

for(intj=0;j<=9;j)

{

readfile>>date;

cout<

}

这里面用到了两个重要的操作符:

<<和>>。

<<是向文件中写入,>>从文件中读取。

当然,写入操作和读取操作不能放在一起,如果放在一起就会读取不成功。

二,写入字符

ofstreamwritefile("3.txt");

charch[]="woaini";

for(inti=0;i

{

writefile.put(ch[i]);

}

ifstreamreadfile("3.txt");

chardate;

while(readfile.get(date))//get之所以可以这样用,因为读到文件末尾就会返回false。

{

cout<

}

这里用到两个方法:

put和get。

Put是写入单个字符,get是读取单个字符。

当然上面的写入操作可以用<<进行,writefile<<”woaini”;

三,整行读写

ifstreamreadfile("1.txt");

ofstreamwritefile("2.txt");

constintlen=200;

charstr[len];

while(readfile.getline(str,len))

{

writefile<

}

这个例子中,1.txt是一个已有文档,里面写满了文字,此程序是把1.txt中的内容写到2.txt中并且保存1.txt中格式不变。

整行读写中用到一个重要函数:

getline,MSDN中的函数原型istream&getline(char*pch,intnCount,chardelim='n');pch是字符数组,用来装读取的数据的;nCount是重要参数,指示一次读取长度;delim是以什么字符结尾,默认是’n’;也可是自己指定。

例子中有两个重要点,一是,len的选取,如果选取过于小,两个n之间的长度大于len,就会读取乱码,所以len尽量要大。

二是,writefile<

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > IT认证

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1