点击这里给我发消息 点击这里给我发消息

C++中的文件输入/输出(1&2):简介&读取文件

添加时间:2013-12-7
    相关阅读: 设计 程序 C++

    简介

      本教程将以C++最基本的文件I/O(输出/输出)开始。此后,我将从更深入的方面,为你展示一些技巧,并分析给出一些有用的函数。

      你需要对C++有一个较好的理解,否则这个教程于你而言将是陌生而毫无用处。

       你的第一个程序

      首先我将给出一段代码,接着再逐行进行解释。我们的第一个程序将建立一个文件,并写入一些字符:

      #include

void main() // 程序从这里开始运行
{
      ofstream SaveFile(“cpp-home.txt”);
      SaveFile << “Hello World, from www.cpp-home.com and Loobian!”;
      SaveFile.close();
}

      仅仅如此吗?没错!这个程序将在当前运行目录下建立一个名为cpp-home.txt的文件,并向它写入“Hello World, from www.cpp-home.com and Loobian!”。

下面给出各行的含义:

      #include  —— 你需要包含此文件以使用C++的文件输入/输出函数。注意:一旦包含了这个文件,你不再需要(为了使用cout/cin)包含iostream.h,因为fstream.h已经自动包含了它。

      在这个头文件中声明了若干个类,包括ifstream,ofstream及fstream,它们都继承自istream和ostream类。

 ofstream SaveFile(“cpp-home.txt”);

1)ofstream即“output file stream(输出文件流)”。它将建立一个句柄(handle),以便我们以后能以一个文件流的形式写入文件。

2)SaveFile —— 这是文件句柄的名字,当然,你还可以换用任何一个你想要的名称。

3)(“cpp-home.txt”); —— 打开名为cpp-home.txt的文件。如果程序运行的当前目录已经存在这样一个文件,则它将被替换掉;万一不存在,程序也会为你创建一个为文件,你不必为此而担心。

      现在,让我们稍微深入一点点。首先,我要指出的是:ofstream是一个类。因此ofstream SaveFile(“cpp-home.txt”);这一语句将创建一个该类的对象;而我们在括号中所传递的参数实际上将传给构造函数:在这里我们将我们要建立的文件的名称作为实际参数传递给了该类的构造函数。当然,我们还可以传递其它的一些信息,不过我以后再对其进行讲解。

      SaveFile << “Hello World, from www.cpp-home.com and Loobian!”; —— “<<”看起来是不是很亲切?不错,想必你已经在cout << 中见到过。这是一个预定义好的运算符。不管怎么说,这行语句所做的,是将上面的那段文本写入文件。正如前面所提到的,SaveFile是一个文件句柄,它关联一个打开的流式文件。所以,我们只须输入句柄名,再跟着输入“<<”,然后接着写下一串用引号括起来的文本,就可以实现对文件的写入。如果我们想写入的是某个变量的值而不是带引号的文本,也只须像通常使用cout << 一样将变量传递给句柄对象,像这样就可以了!

SaveFile << variablename;

      SaveFile.close(); —— 既然我们打开了一个流文件,那么当我们用完它之后,就必须关闭它。SaveFile是ofstream类的一个对象,而该类(ofstream)有一个用于关闭文件的成员函数,即close() 函数。因此,我们只要依次输入文件句柄名,点号和close(),就可以关闭该文件!

      注意:一旦你关闭文件,在你重新打开它以前,就再不能对它进行访问。

       以上就是一个可以写文件的最简单程序。的确很容易!不过,正如你即将在以后部分的教程中所看到的,还有更多的东西要学呢!

C++中的文件输入/输出(2)
来自loobian@cpp-home.com  作者Ilia Yordanov

读取文件

      你已经看到了应该如何写文件。现在,当我们已经得到cpp-home.txt文件时,我们将要读取它,并且将内容打印在屏幕上。

      首先,我要指出的是,有很多种方法可以读取文件。以后我会向你们介绍所有的方法(就我所知的)。此刻,我先向你展示最佳的方法(我认为的)。

正如你已经熟悉的——我将首先给出一段程序代码,然后,我会详细地对它进行解释说明:

#include
void main() //程序从这里开始
{
    ifstream OpenFile("cpp-home.txt");
    char ch;
    while(!OpenFile.eof())
    {
       OpenFile.get(ch);
       cout << ch;
    }
    OpenFile.close();
}

你想必已经了解首行的意义所在,而剩下的部分将由我为你解释。

      ifstream OpenFile(“cpp-home.txt”) —— 我猜它对现在的你而言多少会熟悉些!ifstream表示“input file stream(输入文件流)”。在前一节的程序中,出现的则是ofstream,它的意义是“output file stream(输出文件流)”。前一节的程序是进行文件的写操作,这就是它用“output(输出)”来表示的原因。而本节的程序则是读取一个文件,这就是它用“input(输入)”来表示的原因。这一行剩下的代码于你而言应当是熟悉的了:OpenFile是ifstream类的一个对象,它将关联一个输入文件流;而用引号括住的内容,就是将要打开的文件的名称。

请注意:这里没有对要打开的文件是否存在进行测试!以后我将向你指出如何进行检测。

      char ch; —— 声明一个字符数组(array of type char)。只是有一点要提醒你:这样的数组(arrays)只能存储一个ASCII字符。

      while(!OpenFile.eof()) —— 如果已经到达文件末尾,eof( )函数将返回一个非零值。因此我们所设计的这个循环将一直持续,直至我们的文件操作到达文件末尾。这样我们就可以遍历整个文件,以便对它进行读取。

      OpenFile.get(ch); —— OpenFile是类ifstream的一个对象。该类声明了一个名为get( )的成员函数。只要我们拥有该对象,我们自然就可以调用这个函数。get( )函数从相应的流文件中读出一个字符,并将其返回给变量。在本例中,get( )函数只带一个参数——用于存储所读取的字符的变量。所以,调用OpenFile.get(ch)后程序将会从OpenFile流中读取一个字符并存入变量ch中。

注意:如果你再次调用该函数,它将读取下一个字符,而不是原来的那一个!你过后将理解为什么会这样。

这就是我们要不断反复循环直至读操作到达文件尾的原因。每循环一次,我们将读出一个字符并将它保存在ch中。

cout <<  ch; —— 显示ch变量值,它保存了读取得到的字符。

File.close(); —— 我们打开了一个流式文件,就需要关闭它。使用close()函数即可将它关闭,这和前一节的一样!

注意:一旦你关闭了一个文件,在你重新打开它之前,你不能再对它进行访问。

大功告成了!我希望你能明白我的解释。当你编译并运行这个程序的时候,它应当会输出:

“Hello World, from www.cpp-home.com and Loobian!”

//////////////////////////////////////////////////////////////////////////////////////////////////////////

Tomorrow0 (2003-8-22 10:08:35) :这段代码运行后为什么在文件末尾会重复最后一个字符?

      经过测试确有如Tomorrow0所说的问题,原文(英文版作者)的确有一点小小的漏洞,eof()返回true的条件是“读到文件结束符”,而非文件内容的最后一个字符。所以读完“3”以后,由于“3”并非文件结束符,所以eof()返回false值,继续读读到文件结束符(大概就是eqiaotea所说的0xff)后eof()才返回true,也就是多读了一次。有些编译器(像DEV C++,其实也就是GNU C++)读到最后一个字符后文件位置的指针会定在那儿,所以就成了TOMORROW0所说的“重复最后一个字符”。我给出一个参考解决的方法是,将源代码片断: while(!OpenFile.eof())  改为: while(OpenFile.get(ch)) cout << ch; 这是因为OpenFile.get()函数当读到文件结束符时会返回false值(否则返回true),因而就不会打印出最后无用的结束符(或重复前一字符),也不需要使用eof()判断了。 感谢指出此问题。

相关C++中的文件输入/输出(1&2):简介&读取文件

咨询热线:020-85648757 85648755 85648616 0755-27912581 客服:020-85648756 0755-27912581 业务传真:020-32579052
广州市网景网络科技有限公司 Copyright◎2003-2008 Veelink.com. All Rights Reserved.
广州商务地址:广东省广州市黄埔大道中203号(海景园区)海景花园C栋501室
= 深圳商务地址:深圳市宝源路华丰宝源大厦606
研发中心:广东广州市天河软件园海景园区 粤ICP备05103322号 工商注册