现在的位置: 首页 > 综合 > 正文

C++笔记5之文件操作

2017年10月13日 ⁄ 综合 ⁄ 共 5423字 ⁄ 字号 评论关闭

函数重载:

Record(int &);

Record(const int &);//新函数

指向函数的指针:

Bool (*pf)(const string &,const string&)

这个语句将pf声明为指向函数的指针,它所指向的函数带两个const string&类型的形参和bool类型返回值。

而*pf两侧的圆括弧是必须的;

Bool *pf (const string &,const string&)//它定义的是,返回bool指针类型的函数。

 

标准io类型在三个独立的头文件中定义:iostream定义读写控制窗口的类型;fstream定义读写已命名文件的类型;而sstream所定义的类型则是用于读写存储在内存中string对象。再过fstream和sstream里定义的每种类型都是从iostream件中定义相关类型派生而来。

Io标准库的条件状态:

Strm::iostate 机器相关整型名,有哥哥iostream类定义,用于定义条件状态

Strm::badbit  strm::iostare类型的值,用于指出被破坏的流;

Strm::failbit   strm::iostare类型的值,用于指出失败的io操作

Strm::eofbit   strm::iostare类型的值;用于指出流已经到达文件结束符

s.eof()如果设置了流s的eofbit值,则该函数返回ture/是否到达文件的结束符/

s.fail()’如果设置了流s的failbit值,该函数返回true//是否输入无效

s.bad()如果设置了流s的badbit值,该函数返回true//检查流是否已破坏

s.good()如果流s处于有效状态,则该函数返回true

s.clear()将流s正的所有状态值都重设为有效状态

s.clear(flag)将流s中的某个指定条件状态设置为有效,flag的类型是strm:iostate

s.setstate(flag)给流s 添加指定条件

s.rdstate()返回流s的当前条件,

例如:

Int ival;

While(cin>>ival,!cin.eof())//直到文件结束符才结束

{

  If(cin.bad())//如果流已破坏则抛出异常

Throw runtime_error(“IOstream corrupted”);

  If(cin.fail)//如果读取失败

{

Cerror<<”baddata ,try again”;

Cin.clear(istream::failbit);

Continue;

}

  ……

}

 

cerr与cout的区别

  cout对应于标准输出流,默认情况下是显示器。这是一个被缓冲的输出,可以被重定向。

  cerr对应标准错误流,用于显示错误消息。默认情况下被关联到标准输出流,但它不被缓冲,也就说错误消息可以直接发送到显示器,而无需等到缓冲区或者新的换行符时,才被显示。一般情况下不被重定向。

  例如下面代码编译后生成test.exe

  //test.cpp

  #include<iostream>

  usingnamespace std;

  intmain()

  {

  cout<< "hello world---cout" << endl ;

  cerr<< "hello world---cerr" << endl ;

  return0;

  }

  在命令行模式下键入下面的命令:

  test>>cout.txt

  运行结果是:

  在生成的cout.txt文件中输出了"helloworld---cout" ,

  同时在显示器上输出了"hello world---cerr" ,

  也就是说cout的输出可以重定向到一个文件中,而cerr必须输出在显示器上。

 

文件的输入和输出:

文件模式:

In 打开文件做读操作

Out打开文件做些操作

App在每次写之前找到文件尾

Ate打开文件后立即将文件定位在文件尾

Trunc打开文件时清空以存在的文件流

Bitnary以二进制模式进行io操作

默认时与ifstream流对象关联的文件将以in模式打开,该模式允许文件做读的操作

与ofstream关联的文件默认则以out模式打开。使文件可写。以out模式打开的文件会被清空,丢弃该文件存储的所有数据。

从效果上看,为ofstream对象指定out模式等效于同时指定了out和trunc模式

对于用ofstream打开的文件,要保存文件已存在的数据,唯一的方法是显式的指定app模式打开。

如:ofstream outfile(“file”);//默认以out模式打开

与ofstreamoutfile(“file”,ofstream::out| ofstream::trunc);等价

Ofstream appfile(“file2”,ofstream::app); 保存文件已存在的数据

 

对同一个文件做输入输出操作

Fstream对戏那个集可以读也可以写它所关联的文件,fstream如何使用它的文件取决于打开文件指定的模式。

默认情况下,fstream对象以in和out模式同时打开,当文件已in和out打开时不清空,如果打开fstream所关联的文件时,值使用out 模式,而不指定in模式,则文件会清空以存在的数据,如果打开文件时指定了trunc模式,则无论是否同时指定了in模式,文件同样被清空,

 

在c++总,有一个stream这个类,所有的io都以这个刘类为基础的,包括我们要认识的文件io,stream这个类有两个重要的运算符:

1,  插入器(<<)

向流输出数据,比如说系统有一个默认的标准输出流(out),一般情况下就是指的显示器,所以,cout<<”write stdout”;就表示吧字符串输出到标准输出流(显示器)

2,  析取器(>>)

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

 

C++中对文件的操作时通过stream的子类fstream来实现的,所以要用这种方式操作文件,就必须加入头文件fstream.h。下面就把此类的文件擦偶偶过程一一道来。

 

1,打开文件

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

Void open(const char* filename ,intmode,int access);

参数:

Filename:要打开的文件名

Mode:要打开文件的方式

Access:打开文件的属性

打开文件属性取值是:

0:普通文件,打开访问

1:只读文件

2:隐含文件

4:系统文件

例如:以二进制输入方式打开文件C:config.sys

Fstream file1;

File1.open(“c:\config.sys”,ios::binary|ios::in,0);

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

File1.open(“c:\config.sys”)==file1.open(“c:\cnfig.sys”,ios::in|ios::out,0);

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

Fstream file1(“c:\config.sys”);

特别提醒的是,fsteam有两个子类:ifstream(input file stream);和ofstream(output filestream);

Ifstream默认以输入方式打开文件,而ofstream默认以输出方式打开文件

   Ifstreamfile2(“c:\pdos.def”);已输入凡是打开文件、

   Ofstreamfile3(“c\x.123”);以输出方式打开文件

所以在实际应用中个人扭矩需要的不同,选择不同的类来定义,如果想以输入方式打开,就用ifstream来定义;如果想以输出方式打开,就用ofstream来定义,如果想以输入输出的方式来打开文件,就用fstream来定义

二:关闭文件

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

三,读写文件

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

1,  文本文件的读写

文本文件的读写很监督:用插入器(<<)向文件输出,用析取器(>>)从文件输入,假设file1是以输入方式打开,file2以输出打开,实例如下:

File2<<”ILove you”;//向文件写入字符串”I love you ”

Int I;

File1>>I;//从文件输入一个整数值

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

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

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

Ends处处一个空字符 输出

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

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

Setpxecision(int p);

比如哟啊吧123当做十六进制输出:file1,<</p>;

2,  二进制文件的读写

1,  put()

put()函数向流写入一个字符,其原型是ofstream &put(char ch).使用液比较简单,如file1.put(‘c’);就是向流写入一个字符‘c’

2,  get()

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

  一种就是和put()对应的形式ifstream &get(char &ch);,功能就是从流中读取一个字符,结果保持你在引用ch中如果到文件尾,返回空字符,如file2.get(x)表示从文件中读取一个字符,并把读取的字符保存在x中,

   另一种从不在的原型是:intget();这种形式是从流中返回一个字符,如果到达文件尾,分那会EOF,如x=file2.get();

            还有一种形式的原型是:ifstream &get(char *buf,int num,char delin=’’);这种形式吧字符读入有buf指向的数组,直到读入num个字符或遇到delin指定的字符,如果没有delin这个参数,将使用缺省换行符‘’。例如

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

3,  读写数据块

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

  Read(unsigned char*buf,int num);

  Write(constunsigned char *bur ,int num);

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

例如:unsigned char str1[]=”I love you ”;

      Int n[5];

      Ifstream in(“in.txt”);

      Ofstrem out(“out.tex”);

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

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

      In.close();out.close();

四,检测EOE

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

五.文件定位:

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

istream &seekg(streamoff offset,seek_dir origin);
ostream &seekp(streamoffoffset,seek_dir origin);

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

ios::beg:  文件开头
ios::cur
:  文件当前位置
ios::end
:  文件结尾
  这两个函数一般用于二进制文件,因为文本文件会因为系统对字符的解释而可能与预想的值不同。

例:

file1.seekg(1234,ios::cur);//把文件的读指针从当前位置向后移1234个字节
file2.seekp(1234,ios::beg);//把文件的写指针从文件开头向后移1234个字节

 

【上篇】
【下篇】

抱歉!评论已关闭.