C++抽象编程——数据文件的基本操作

熟悉对文件的基本操作可以让我们更加深入的了解C++的强大。我们先介绍一下数据文件的基本操作,然后尝试用STL的一些方式来对它进行处理。

文件及其结构

无论何时当我们在计算机上存储信息超过程序的运行时间,通常的方法是将数据收集到一个地方,将其作为文件存储在永久存储介质上(就是说某些信息我的程序暂时不用了,但是以后可能还要用,我们就先把它当做文件储存起来)。通常,使用磁性或光学介质存储文件,例如安装在计算机内的硬盘或便携式闪存驱动器或记忆棒。然而,媒体的具体细节并不重要; 重要的是,我们存储在计算机上的永久数据:对象 ,文档,游戏,可执行程序,源代码等都以文件的形式存储起来。
在大多数系统上,文件有多种类型。例如,在编程域中,我们使用源文件,对象文件和可执行文件,每个文件具有不同的表示形式。当使用文件存储数据以供程序使用时,该文件通常由文本组成,因此称为文本文件(text file,常常以后缀 txt 结尾)。我们可以将文本文件视为存储在介质中,并由文件名标识的字符序列(You can think of a text file as a sequence of characters stored in a permanentmedium and identified by a file name)。文件的名称和其包含的字符的名称及其内容具有相同的关系。

当然这样解释难免有些抽象,我们举个例子说明,下面的文本文档包含了Lewis Carroll的无意义诗歌Jabberwocky的第一节(出现于Through the Looking Glass)。

该文件的名称是Jabberwocky.txt,内容由构成该诗第一节的四行字符组成。
当我们查看文件时,我们通常会将其视为二维结构(two-dimensional structure):由单个字符组成的一系列行。然而,在内部,文本文件被表示为一维字符序列。除了可以看到的打印字符之外,文件还包含标记每一行结尾的换行符(newline character)。
在许多方面,文本文件类似于字符串。每个都由具有指定的字符的有序集合组成。另一方面,字符串和文件在几个重要方面有所不同。最重要的区别是数据的永久性。在程序运行期间,一个字符串临时存储在计算机的存储器中; 文件永久存储在长期存储设备上,直到被明确删除为止。字符串和文件中对独立字符的引用方式也有差异。因为字符串中的每个字符都有一个下标(index),所以我们可以通过选择适当的下标值来以任何顺序处理这些字符,相比之下,文本文件中的字符往往要按照顺序进行处理。 与文件数据一起工作的程序通常从文件开头开始,然后按照方式工作 - 从输入文件中读取现有字符,或将新的字符写入输出文件 - 到文件末尾。(即文本文件的读取只能从开头到结尾

Using file streams(使用文件流)

C++ stream库出口了形成一些层次结构的类。为了更好的了解整个结构,从两个stream类开始 ——由库出口的ifstream 和 ofstream。一旦我们熟悉了这些例子,就能更容易地整体理解流层次结构。
适用于文件流的的最常见方法在下面的表格中。但是,研究此表不太可能对您学习使用文件的一些简单模有太大帮助。任何语言(C++也不例外)的文件处理往往是惯用的,因为我们只需要学习一般策略,然后将该策略应用于编写的应用程序中。

所有流都支持的方法解释
stream.fail()如果stream处于错误状态,则返回true。这通常发生在当我们尝试读取超过文件末尾的数据时,但也可能表示数据中的完整性错误。
stream.eof()如果stream位于文件的末尾,则返回true。eof方法仅在调用stream.fail()失败后才有用。在这一点上,调用eof可以测试故障指示是由文件结束还是其他数据错误引起的
stream.clear()重置stream。当我们需要在发生故障后需要重新使用流时,调用此方法
文件流支持的方法
stream.open(filename)尝试打开命名文件并将其添加到stream中。文件传输的方向由stream类型确定:输入流为输入而打开,输出流为输出而打开(input streams are opened for input, output streams are opened for output)。filename参数是一个C-Style的字符串,这意味着你需要在任何C++字符串上调用c_str。 您可以通过调用fail方法检查打开的方法是否失败。
stream.close()关闭已经被导入的stream
输入流支持的方法
stream >> variable将格式化数据读入变量。数据格式由变量类型和任何输入有效的控制
stream.get()返回流中的下一个字符。返回值是一个整数,可以用于识别由常量EOF表示的文件结束字符。
stream.unget()备份流的内部指针,以便读取的最后一个字符时将被下一次调用get再次读取。
getline(stream, str)从流中读取下一行输入,然后放到字符串str中
输出流支持的方法
stream << expression将格式化数据写入输出流。数据格式由表达式类型和任何输出操纵器控制
stream.put(ch)将字符ch写入输出流

用C++读取或写入文件

用C ++读取或写入文件需要执行以下步骤:
1. 声明一个流变量来引用该文件(Declare a stream variable to refer to the file.)。 使用文件的程序通常会为同时处于活动状态的每个文件声明一个流变量。因此,如果正在编写一个读取输入文件并使用该数据写入输出文件的程序,则需要声明两个变量,如下所示:
ifstream infile;
ofstream outfile;
2. 打开文件(Open the file)。 在使用流变量之前,需要建立该变量和实际文件之间的关联。 此操作称为打开文件(opening),并通过调用流方法打开来执行。例如,如果要读取Jabberwocky.txt文件中包含的文本,则通过执行方法调用来打开该文件:
infile.open(“Jabberwocky.txt”);
注意:因为流库的引入要字符串类,所以open方法需要一个C风格的字符串作为文件名。因此,字符串文字因此是可以接受的。但是,如果文件的名称存储在名为filename的字符串变量中,则需要打开文件:
infile.open(filename.c_str());
如果请求的文件丢失,则流将记录该错误,并通过调用fail()方法失败来检查该错误。我们作为程序员负责从这种故障中恢复,我们后面会介绍各种各样的策略。
3. 传输数据(Transfer the data)。打开数据文件后,您可以使用相应的流操作来执行实际的I / O操作。 根据应用程序,您可以选择传输文件数据的几种策略中的任何一种。 在最简单的层面上,您可以逐个读写文件。 然而,在某些情况下,逐行处理文件更方便。 在更高级别,您可以选择读取和写入格式化的数据,这样可以使用字符串和其他数据类型混合数字数据。 这些策略下一篇会提到。
4. 关闭文件(Close the file)。 完成所有数据传输后,您需要通过调用流方法关闭来将文件系统指示给文件系统,就像这样:
infile.close();
这个操作会中断流与实际文件之间的关联。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值