C++ primer plus 第17 章 输入、输出和文件:文件输入和输出01

C++ primer plus 第17 章 输入、输出和文件:文件输入和输出01

C++ primer plus 第17 章 输入、输出和文件:文件输入和输出01


17.4 文件输入和输出

大多数计算机程序都使用了文件。字处理程序创建文档文件;数据库程序创建和搜索信息文件;编译器读取源代码文件并生成可执行文件。文件本身是存储在某种设备(磁带、光盘、软盘或硬盘)上的一系列字节。通常,操作系统管理文件,跟踪它们的位置、大小、创建时间等。除非在操作系统级别上编程,否则通常不必担心这些事情。需要的只是将程序与文件相连的途径、让程序读取文件内容的途径以及让程序创建和写入文件的途径。重定向(本章前面讨论过)可以提供一些文件支持,但它比显式程序中的文件IO的局限性更大。另外,重定向来自操作系统,而非C++,因此并非所有系统都有这样的功能。本书前面简要地介绍过文件IO,本章将更详细地探讨这个主题。
C++ IO 类软件包处理文件输入和输出的方式与处理标准输入和输出的方式非常相似。要写入文件,需要创建一个 ofstrcam 对象,并使用ostream方法,如<<插入运算符或 wrie()。要读取文件,需要创建一个ifstream 对象,并使用istream 方法,如>>抽取运算符或 get()。然而,与标准输入和输出相比,文件的管理更为复杂。例如,必须将新打开的文件和流关联起来。可以以只读模式、只写模式或读写模式打开文件。写文件时,可能想创建新文件、取代旧文件或添加到旧文件中,还可能想在文件中来回移动。为帮助处理这些任务,C++在头文件ftream(以前为fstream.h)中定义了多个新类,其中包括用于文件输入的ifstream 类和用于文件输出的 ofstream类。C++还定义了一个ftream类,用于同步文件 IO。这些类都是从头文件 iostream 中的类派生而来的,因此这些新类的对象可以使用前面介绍过的方法。

17.4.1 简单的文件 1/0

要让程序写入文件,必须这样做:

  • 1.创建一个 ofstream 对象来管理输出流:
  • 2.将该对象与特定的文件关联起来;
  • 3.以使用cout的方式使用该对象,唯一的区别是输出将进入文件,而不是屏幕。要完成上述任务,首先应包含头文件ftream。对于大多数(但不是全部)实现来说,包含该文件便自动包括iostream 文件,因此不必显示包含iostream。然后声明一个ofstream 对象:
ofstream fout;//create an ofstream obiect named fout

对象名可以是任意有效的C++名称,如fout、outFile、cgate 或 didi。接下来,必须将这个对象与特定的文件关联起来。为此,可以使用open()方法。例如,假设要打开文件iar.txt 进行输出,则可以这样做:

fout.open("jar.txt");//associate fout with jar.txt

可以使用另一个构造函数将这两步(创建对象和关联到文件)合并成一条语句:

ofstream fout("jar.txt");// create fout object, associate it with jar.txt

然后,以使用cout的方式使用fout(或选择的其他名称)。例如,要将Dul Data 放到文件中,可以这样做:

fout << "Dull Data";

由于 ostream 是 ofstream 类的基类,因此可以使用所有的 ostream方法,包括各种插入运算符定义、格式化方法和控制符。ofstream 类使用被缓冲的输出,因此程序在创建像fut 这样的 ofstream 对象时,将为输出缓冲区分配空间。如果创建了两个ofstream 对象,程序将创建两个缓冲区,每个对象各一个。像fou这样的 ofstrcam 对象从程序那里逐字节地收集输出,当缓冲区填满后,它便将缓冲区内容一同传输给目标文件。由于磁盘驱动器被设计称以大块的方式传输数据,而不是逐字节地传输,因此通过缓冲可以大大提高从程序到文件传输数据的速度。
以这种方式打开文件来进行输出时,如果没有这样的文件,将创建一个新文件;如果有这样的文件,则打开文件将清空文件,输出将进入到一个空文件中。本章后面将介绍如何打开已有的文件,并保留其内容,
警告:以默认模式打开文件进行输出将自动把文件的长度截短为零,这相当于删除已有的内容
读取文件的要求与写入文件相似:
创建一个 ifstream 对象来管理输入流:
将该对象与特定的文件关联起来:
以使用cin 的方式使用该对象。
上述读文件的步骤类似于写文件。首先,当然要包含头文件ftream。然后声明一个ifstream 对象,将它与文件名关联起来。可以使用一两条语句来完成这项工作:

//two statements
ifstream fin;//create ifstream object called fin
fin.open("jellyjar.txt");//open jellyjar.txt for reading//one statement
ifstream fis("jamjar.txt");// create fis and associate with jamjar.txt

现在,可以像使用cin那样使用fin或s。例如,可以这样做:

char ch;
fin >>ch;
//read a character from the jellyjar.txt file
char buf[80];
fin >> buf;// read a word from the file
fin.getline(buf,80);//read a line from the file
string line;
getline(fin,line);//read from a file to a string obiect

输入和输出一样,也是被缓冲的,因此创建 ifstream 对象与 fn 一样,将创建一个由 fin 对象管理的输入缓冲区。与输出一样,通过缓冲,传输数据的速度比逐字节传输要快得多。
当输入和输出流对象过期(如程序终止)时,到文件的连接将自动关闭。另外,也可以使用cIose()方法来显式地关闭到文件的连接:

fout.close();
fin.close();
//close output connection to file//close input connection to file

关闭这样的连接并不会删除流,而只是断开流到文件的连接。然而,流管理装置仍被保留。例如,fin对象与它管理的输入缓冲区仍然存在。您稍后将知道,可以将流重新连接到同一个文件或另一个文件。
我们来看一个简短的例子。程序清单17.16的程序要求输入文件名,然后创建一个名称为输入名的文件,将一些信息写入到该文件中,然后关闭该文件。关闭文件将刷新缓冲区,从而确保文件被更新。然后程序打开该文件,读取并显示其内容。注意,该程序以使用cin和cout的方式使用fn和fout。另外,该程序将文件名读取到一个 string对象中,然后使用方法cst()来给 ofstream和 ifstream 的构造函数提供一个C-风格字符串参数。

程序清单17.16 fileio.cpp

// fileio.cpp -- saving to a file
#include <iostream> // not needed for many systems
#include <fstream>
#include <string>

int main()
{
    using namespace std;
    string filename;

    cout << "Enter name for new file: ";
    cin >> filename;

// create output stream object for new file and call it fout
    ofstream fout(filename.c_str());

    fout << "For your eyes only!\n";        // write to file
    cout << "Enter your secret number: ";   // write to screen
    float secret;
    cin >> secret;
    fout << "Your secret number is " << secret << endl;
    fout.close();           // close file

// create input stream object for new file and call it fin
    ifstream fin(filename.c_str());
    cout << "Here are the contents of " << filename << ":\n";
    char ch;
    while (fin.get(ch))     // read character from file and
        cout << ch;         // write it to screen
    cout << "Done\n";
    fin.close();
    // std::cin.get();
    // std::cin.get();
    return 0; 
}

在这里插入图片描述
如果查看该程序所在的目录,将看到一个名为pythag的文件,使用文本编辑器打开该文件,其内容将
与程序输出相同。

  • 17
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值