设为首页 加入收藏

TOP

C++文件读写详解(二)
2014-03-10 12:53:24 来源: 作者: 【 】 浏览:265
Tags:文件 读写 详解

 

  2.关闭文件

  当文件读写操作完成之后,我们必须将文件关闭以使文件重新变为可访问的。成员函数close(),它负责将缓存中的数据排放出来并关闭文件。这个函数一旦被调用,原先的流对象就可以被用来打开其它的文件了,这个文件也就可以重新被其它的进程所访问了。为防止流对象被销毁时还联系着打开的文件,析构函数将会自动调用关闭函数close。

  3.文本文件的读写

  类ofstream, ifstream 和fstream 是分别从ostream, istream 和iostream 中引申而来的。这就是为什么 fstream 的对象可以使用其父类的成员来访问数据。

  一般来说,我们将使用这些类与同控制台(console)交互同样的成员函数(cin 和 cout)来进行输入输出。如下面的例题所示,我们使用重载的插入操作符<<:

  [cpp] view plaincopyprint

  // writing on a text file

  #include

  int main () {

  ofstream out("out.txt");

  if (out.is_open())

  {

  out << "This is a line.\n";

  out << "This is another line.\n";

  out.close();

  }

  return 0;

  }

  //结果: 在out.txt中写入:

  This is a line.

  This is another line

  从文件中读入数据也可以用与 cin>>的使用同样的方法:

  [cpp] view plaincopyprint

  // reading a text file

  #include

  #include

  #include

  int main () {

  char buffer[256];

  ifstream in("test.txt");

  if (! in.is_open())

  { cout << "Error opening file"; exit (1); }

  while (!in.eof() )

  {

  in.getline (buffer,100);

  cout << buffer << endl;

  }

  return 0;

  }

  //结果 在屏幕上输出

  This is a line.

  This is another line

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

  状态标志符的验证(Verification of state flags)

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

  bad()

  如果在读写过程中出错,返回 true 。例如:当我们要对一个不是打开为写状态的文件进行写入时,或者我们要写入的设备没有剩余空间的时候。

  fail()

  除了与bad() 同样的情况下会返回 true 以外,加上格式错误时也返回true ,例如当想要读入一个整数,而获得了一个字母的时候。

  eof()

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

  good()

  这是最通用的:如果调用以上任何一个函数返回true 的话,此函数返回 false 。

  要想重置以上成员函数所检查的状态标志,你可以使用成员函数clear(),没有参数。

  获得和设置流指针(get and put stream pointers)

  所有输入/输出流对象(i/o streams objects)都有至少一个流指针:

  ifstream, 类似istream, 有一个被称为get pointer的指针,指向下一个将被读取的元素。

  ofstream, 类似 ostream, 有一个指针 put pointer ,指向写入下一个元素的位置。

  fstream, 类似 iostream, 同时继承了get 和 put

  我们可以通过使用以下成员函数来读出或配置这些指向流中读写位置的流指针:

  tellg() 和 tellp()

  这两个成员函数不用传入参数,返回pos_type 类型的值(根据ANSI-C++ 标准) ,就是一个整数,代表当前get 流指针的位置 (用tellg) 或 put 流指针的位置(用tellp).

  seekg() 和seekp()

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

  seekg ( pos_type position );

  seekp ( pos_type position );

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

  seekg ( off_type offset, seekdir direction );

  seekp ( off_type offset, seekdir direction );

  使用这个原型可以指定由参数direction决定的一个具体的指针开始计算的一个位移(offset)。它可以是:

  ios::beg从流开始位置计算的位移

  ios::cur从流指针当前位置开始计算的位移

  ios::end从流末尾处开始计算的位移

  流指针 get 和 put 的值对文本文件(text file)和二进制文件(binary file)的计算方法都是不同的,因为文本模式的文件中某些特殊字符可能被修改。由于这个原因,建议对以文本文件模式打开的文件总是使用seekg 和 seekp的第一种原型,而且不要对tellg 或 tellp 的返回值进行修改。对二进制文件,你可以任意使用这些函数,应该不会有任何意外的行为产生。

        

首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C++:关于const类型 下一篇C++ AO读取shapefile的属性值

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·HTTPS 详解一:附带 (2025-12-26 02:20:37)
·TCP/IP协议到底在讲 (2025-12-26 02:20:34)
·TCP和UDP在socket编 (2025-12-26 02:20:32)
·有没有适合新手练习 (2025-12-26 01:48:47)
·用清华镜像网怎么下 (2025-12-26 01:48:44)