c++读写文件的几种方法,C++文件读写操作

  c++读写文件的几种方法,C++文件读写操作

  看C编程思路,每个练习基本都用到了OfStream,IfStream,fStream。我以前大概知道它们的用法和意思。看了大牛的几篇博文,我整理了一下,总结如下:

  这主要是讨论fstream的内容:

  【java】查看plaincopyprint?

  #include fstream ofstream//文件写操作内存写存储设备ifstream//文件读操作,存储设备读入内存区域

  Fstream//读写操作,可以读写打开的文件。

  #包括fstream

  Ofstream //文件写操作内存写存储设备

  如果stream //文件读操作,存储设备将该区域读入内存。

  Fstream //读写操作,可以读写打开的文件。

  1.打开文件

  在fstream类中,成员函数open()实现打开文件的操作,从而将数据流与文件关联起来,通过ofstream、ifstream、fstream对象读写文件。

  功能:打开()

  【cpp】查看plaincopyprint?

  SPAN publicmemberfunctionvoidopen(const char * filename,IOs _ base:open mode=IOs _ base:in IOs _ base:out);void open(constwchar _ t * _ Filename,IOs _ base:open mode mode=IOs _ base:in IOs _ base:out,int prot=IOs _ base:_ open prot);/SPAN

  公共成员函数

  void open(常量char *文件名,

  IOs _ base:openmode mode=IOs _ base:in IOs _ base:out);

  void open(const wchar _ t * _ Filename,

  IOs _ base:openmode mode=IOs _ base:in IOs _ base:out,

  int prot=IOs _ base:_ open prot);

  参数:filename操作文件名

  打开模式文件的方式

  prot打开文件的属性//很少使用。在查看数据时,我们发现有两种方式。

  打开文件的方式是在ios类中定义的(所以是流I/O的基类)。有如下几种方式:

  ios:in

  打开文件进行输入(读取)

  ios:out

  打开文件进行输出(写入)

  ios:ate

  初始位置:文件结尾

  ios:app

  所有输出都被附加到文件的末尾。

  ios:trunc

  如果文件已经存在,请先删除它

  ios:binary

  二进制

  这些方法可以以OR运算(" ")的形式组合使用:例如

  【cpp】查看plaincopyprint?

  ofstreamoutOut.open (hello.txt ,iOS:in iOS:out iOS:binary)//根据自己的需求做出合适的选择

  ofstream out

  Out.open (hello.txt ,iOS:in iOS:out iOS:binary)//iOS类中也定义了根据自己的需要打开文件的属性:

  0

  普通文件,打开操作

  对于文件的属性,也可以用or运算和" "组合使用,这里不做说明。

  在许多程序中,您可能会遇到ofstream out (hello.txt )、ifstreamin( . 的使用),以及fstream foi( . ).可以不显式调用open()函数来操作文件,直接调用其默认的打开方式,因为open()函数是在stream类的构造函数中调用的,而

  【cpp】查看plaincopyprint?

  streamout的跨度(“.”,IOs:out);ifstreamin( . ),IOs:in);fstreamfoi(“.”,IOs:in IOs:out);/SPAN

  ofstream out(“.”),IOs:out);

  ifstream in(“.”),IOs:in);

  fstream foi( . ,IOs:in IOs:out);

  当使用默认方法对文件进行操作时,可以使用成员函数is_open()来验证文件是否打开。

  2.关闭文件

  当文件读写操作完成后,我们必须关闭文件以使其再次可访问。成员close(),负责释放缓存中的数据并关闭文件。这个函数一旦被调用,原来的stream对象就可以用来打开其他文件,这个文件就可以再次被其他进程访问。为了防止流对象在被销毁时接触到打开的文件,析构函数会自动调用close函数。

  3.读取和写入文本文件

  stream、ifstream和fstream类分别从ostream、istream和iostream派生。这就是为什么fstream的对象可以使用其父类的成员来访问数据。

  一般来说,我们将使用这些类和相同的成员函数(cin和cout ),它们与控制台交互以进行输入和输出。如下例所示,我们使用重载的插入运算符:

  【cpp】查看plaincopyprint?

  //writingnoatextfile # include fiostream . h int main(){ of stream out( out . txt );if(out . is _ open()){ out this isaline。\ n ;“出去”是另一条线。\ n ;out . close();} return0}//结果:写:Thisisaline。这是out.txt中的另一行

  //在文本文件上书写

  #包含fiostream.h

  int main () {

  of stream out( out . txt );

  if (out.is_open())

  这是一条线。\ n ;

  “出去”这是另一行。\ n ;

  out . close();

  返回0;

  //结果:写入out.txt:

  这是一条线。

  这是另一条线

  从文件中读取数据的方式也可以与使用cin相同:

  【cpp】查看plaincopyprint?

  //reading textfile # include iostream . h # include fstream . h # include stdlib . h int main(){ char buffer[256];ifstreamin( test . txt );如果(!in . is _ open()){ cout Erroropeningfile ;出口(1);}while(!in.eof()){in.getline(buffer,100);cout缓冲区endl} return0}//结果是output Thisisaline。这是屏幕上的另一行。

  //读取文本文件

  #包含iostream.h

  #包含fstream.h

  #包含stdlib.h

  int main () {

  char缓冲器[256];

  if stream in( test . txt );

  如果(!in.is_open())

  { cout 打开文件时出错;出口(1);}

  而(!in.eof())

  in.getline(缓冲区,100);

  cout缓冲区endl

  返回0;

  //结果在屏幕上输出

  这是一条线。

  这是另一条线

  上面的例子读入一个文本文件的内容,然后把它打印到屏幕上。注意,我们使用了一个名为eof的新成员函数,它由ifstream从类ios继承而来,当它到达文件末尾时返回true。

  状态标志的验证

  除了eof(),还有一些验证流状态的成员函数(它们都返回bool类型的返回值):

  坏()

  如果在读写过程中发生错误,则返回true。例如,当我们想要写入一个未打开的文件时,或者当我们想要写入的设备没有剩余空间时。

  失败()

  除了在与bad()相同的情况下返回true,它还在添加格式错误时返回true,例如当您想要读取一个整数并获得一个字母时。

  eof()

  如果读取的文件到达文件末尾,则返回true。

  好()

  这是最常见的:如果调用上面的任何一个函数都返回true,那么这个函数返回false。

  要重置由上述成员函数检查的状态标志,可以使用不带参数的成员函数clear()。

  获取和放置流指针。

  所有i/o流对象都至少有一个流指针:

  Ifstream与istream类似,有一个名为get pointer的指针,指向下一个要读取的元素。Ofstream类似于ostream,有一个指针put指针,指向写入下一个元素的位置。Fstream与iostream类似,继承get和put。我们可以通过使用以下成员函数来读取或配置这些流指针,以读取和写入流中的位置:

  Tellg()和tellp()

  这两个成员函数不需要传入参数,返回pos_type的值(根据ANSI-C标准),该值为整数,代表当前get流指针(使用tellg)或put流指针(使用tellp)的位置。

  Seekg()和seekp()

  这对函数分别用于改变流指针get和put的位置。两个函数都作为两个不同的原型重载:

  seekg ( pos_type位置);

  seekp(pos _ type position);

  使用这个原型,流指针被更改为指向从文件计算的绝对位置。传入的参数类型要求与函数tellg和tellp的返回值类型相同。

  seekg ( off_type offset,seek dir direction);

  seekp ( off_type offset,seek dir direction);

  使用这个原型,您可以指定一个特定指针开始计算的偏移量,这个偏移量由参数direction决定。它可以是:

  ios:beg

  从流的开始处计算的位移

  ios:cur

  从流指针的当前位置计算的位移

  ios:end

  从流的末端计算的位移。

  对于文本文件和二进制文件,流指针get和put的值计算方式不同,因为文本模式文件中的一些特殊字符可能会被修改。为此,对于以文本文件模式打开的文件,建议始终使用seekg和seekp的第一个原型,不要修改tellg或tellp的返回值。对于二进制文件,可以任意使用这些函数,应该不会出现意外的行为。

  以下示例使用这些函数来获取二进制文件的大小:

  【cpp】查看plaincopyprint?

  //获取filesize # include iostream . h # include fstream . h const char * filename= test . txt ;intmain(){longl,m;ifstreamin(文件名,IOs:in IOs:binary);l=in . tellg();in.seekg(0,IOs:end);m=in . tellg();in . close();cout sizeof 文件名;“cout”是“(m-l)”字节。\ n ;return0}//Result:sizeof example . txt is 40 bytes

  //获取文件大小

  #包含iostream.h

  #包含fstream.h

  const char * filename= test.txt

  int main () {

  long l,m;

  ifstream in(文件名,IOs:in IOs:binary);

  l=in . tellg();

  in.seekg (0,IOs:end);

  m=in . tellg();

  in . close();

  文件名的“大小”;

  “cout”是“(m-l)”字节。\ n ;

  返回0;

  //结果:

  example.txt的大小为40字节。

  4.二进制文件

  在二进制文件中,使用and,以及函数(如getline)来操作输入输出数据,没有实际意义,虽然它们是语法上的。

  该流包含两个专门为顺序读写数据而设计的成员函数:write和read。第一个函数(write)是ostream的成员函数,由ofstream继承。而read是istream的成员函数,由ifstream继承。fstream类的对象具有这两种功能。他们的原型是:

  write ( char * buffer,streamsize size);

  read ( char * buffer,streamsize size);

  这里,buffer是内存块的地址,用来存储或读取数据。size参数是一个整数值,指示从缓冲区读取或写入的字符数。

  【cpp】查看plaincopyprint?

  //reading binary file # include iostream # include fstream . h const char * filename= test . txt ;int main(){ char * buffer;longsizeifstreamin(文件名,IOs:in IOs:binary IOs:ate);size=in . tellg();in.seekg(0,IOs:beg);buffer=new char[size];in.read(缓冲区,大小);in . close();cout“thecompletefilesinabuffer”;删除[]缓冲区;return0}//运行结果:Thecompletefileisinabuffer

  //读取二进制文件

  #包括iostream

  #包含fstream.h

  const char * filename= test.txt

  int main () {

  char *缓冲区;

  长尺寸;

  ifstream in(文件名,IOs:in IOs:binary IOs:ate);

  size=in . tellg();

  in.seekg (0,IOs:beg);

  buffer=new char[size];

  in.read(缓冲区,大小);

  in . close();

  cout“整个文件在缓冲区中”;

  删除[]缓冲区;

  返回0;

  //运行结果:

  完整的文件在缓冲区中

  5.缓冲和同步

  当我们操作文件流时,它们与一个streambuf类型的缓冲区相关联。这个缓冲区实际上是一个内存空间,作为流和物理文件的媒介。比如一个输出流,每次调用成员函数put(写单个字符)时,这个字符不是直接写入输出流对应的物理文件,而是先插入到流的缓冲区。

  当缓存被刷新时,其中的所有数据要么被写入物理介质(如果是输出流),要么被简单地擦除(如果是输入流)。这个过程称为同步,它可能发生在以下任何情况下:

  当文件关闭时:在文件关闭之前,所有未完全写入或读取的缓存将被同步。当高速缓存缓冲区已满时:高速缓存缓冲区有一定的空间限制。当缓存已满时,它会自动同步。控制字符清楚地表明,当遇到流中的某些特定控制字符时,将发生同步。这些控件包括:flush和endl。显式函数sync():调用成员函数sync()(无参数)可以导致立即同步。此函数返回一个int值,该值等于-1,表示流没有关联的缓存或者操作失败。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • office2010激活密钥大全 怎么永久激活office2010
  • project2010产品密钥免费_project2010激活密钥永久激活码
  • c语言调用退出函数 c语言退出整个程序怎么写
  • c语言中怎么给函数初始化 c语言的初始化语句
  • c语言编写函数计算平均值 c语言求平均函数
  • chatgpt是什么?为什么这么火?
  • ChatGPT为什么注册不了?OpenAI ChatGPT的账号哪里可以注册?
  • OpenAI ChatGPT怎么注册账号?ChatGPT账号注册教程
  • chatgpt什么意思,什么是ChatGPT ?
  • CAD中怎么复制图形标注尺寸不变,CAD中怎么复制图形线性不变
  • cad中怎么创建并使用脚本文件,cad怎么运行脚本
  • cad中快速计算器的功能,cad怎么快速计算
  • cad中快速修改单位的方法有哪些,cad中快速修改单位的方法是
  • cad中心点画椭圆怎么做,cad轴测图怎么画椭圆
  • CAD中常用的快捷键,cad各种快捷键的用法
  • 留言与评论(共有 条评论)
       
    验证码: