C 中的文件输入和输出
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ifstream OpenFile("hey.txt");
char ch; while(!OpenFile.eof()) {
OpenFile.get(ch); cout << ch; } OpenFile.close(); }
你想必已经了解首行的意义所在,而剩下的部分将由我为你解释。 ifstream OpenFile(“hey.txt”) —— 我猜它对现在的你而言多少会熟悉些! ifstream 表示“input file stream(输入文件流)”。在前一节的程序中,出现的则是 ofstream,它的意义是“output file stream(输出文件流)”。前一节的程序是进行文 件的写操作,这就是它用“output(输出)”来表示的原因。而本节的程序则是读取 一个文件,这就是它用“input(输入)”来表示的原因。这一行剩下的代码于你而言 应当是熟悉的了:OpenFile 是 ifstream 类的一个对象,它将关联一个输入文件 流;而用引号括住的内容,就是将要打开的文件的名称。 请注意:这里没有对要打开的文件是否存在进行测试!以后我将向你指出如 何进行检测。
方式使用 ios::out
ios::ate
你写入的所有数据将被追加到文件的末尾,此
方式不使用 ios::out
ios::trunk
删除文件原来已存在的内容(清空文件)
ios::nocreate 如果要打开的文件并不存在,那么以此参数调
用 open()函数将无法进行。
ios::noreplace 如果要打开的文件已存在,试图用 open()函
据此,只要 file1.txt 和 file2.txt 并存储了文本内容,你将看到这些内容。
现在,该向你演示的是,文件名并不是你唯一可以向 open()函数或者构造函 数(其实都一样)传递的参数。下面是一个函数原型:
ifstream OpenFile(char *filename, int open_mode);
OpenFile.get(ch); —— OpenFile 是类 ifstream 的一个对象。该类声明了一 个名为 get( )的成员函数。只要我们拥有该对象,我们自然就可以调用这个函数。 get( )函数从相应的流文件中读出一个字符,并将其返回给变量。在本例中,get( )
函数只带一个参数——用于存储所读取的字符的变量。所以,调用 OpenFile.get(ch)后程序将会从 OpenFile 流中读取一个字符并存入变量 ch 中。
我希望现在你已经明白“打开模式”是什么意思了! 现在,是时候向你展示一些真正有用的东西了!我敢打赌你现在还不知道应 当怎样打开一个可以同时进行读取和写入操作的文件!下面就是实现的方法: fstream File(“hey.txt”,ios::in | ios::out);
实际上,这只是一个声明语句。我将在下面数行之后给你一个代码示例。但 此时我首先想提及一些你应当知道的内容。
注意:一旦你关闭文件,在你重新打开它以前,就再不能对它进行访问。
以上就是一个可以写文件的最简单程序。的确很容易!不过,正如你即将在 以后部分的教程中所看到的,还有更多的东西要学呢!
读取文件
你已经看到了应该如何写文件。现在,当我们已经得到 hey.txt 文件时,我 们将要读取它,并且将内容打印在屏幕上。
数打开时将返回一个错误。
ios::binary
以二进制的形式打开一个文件。
实际上,以上的值都属于一个枚举类型的 int 常量。但为了让你的编程生涯 不至于太痛苦,你可以像上表所见的那样使用那些名称。
下面是一个关于如何使用打开模式的例子: #include <fstream >
void main() {
经使用了它,那么我只会在原文件的末尾进行添加。所以,如果 file1.txt 原有的 内容是这样: Hi! This is a test!
那么执行上面的代码后,程序将会为它添上“That’s new!”,因此它看起来将 变成这样: Hi! This is a test!That’s new!
假如你打算设置不止一个的打开模式标志,只须使用 OR 操作符或者是 | , 像这样: ios::ate | ios::binary
SaveFile.close();—— 既然我们打开了一个流文件,那么当我们用完它之 后,就必须关闭它。SaveFile 是 ofstream 类的一个对象,而该类(ofstream)有一 个用于关闭文件的成员函数,即 close() 函数。因此,我们只要依次输入文件句 柄名,点号和 close(),就可以关闭该文件!
C++中的文件输入/输出
简介
本教程将以 C++最基本的文件 I/O(输出/输出)开始。此后,我将从更深入 的方面,为你展示一些技巧,并分析给出一些有用的函数。
你需要对 C++有一个较好的理解,否则这个教程于你而言将是陌生而毫无用 处。
你的第一个程序
首先我将给出一段代码,接着再逐行进行解释。我们的第一个程序将建立一 个文件,并写入一些字符: #include <fstream>
下面给出各行的含义: #include <fstream>—— 你需要包含此文件以使用 C++的文件输入/输出函 数。
ofstream SaveFile(“hey.txt”); 1)ofstream 即“output file stream(输出文件流)”。它将建立一个句柄 (handle),以便我们以后能以一个文件流的形式写入文件。 2)SaveFile—— 这是文件句柄的名字,当然,你还可以换用任何一个你想 要的名称。 3)(“hey.txt”); —— 打开名为 hey.txt 的文件。如果程序运行的当前目录已经 存在这样一个文件,则它将被替换掉;万一不存在,程序也会为你创建一个为文 件,你不必为此而担心。
你应当知道 filename 表示文件的名称(一个字符串),而新出现的则是
open_mode(打开模式)。open_mode 的值用来定义以怎样的方式打开文件。
下面是打开模式的列表:
名称
描述
Biblioteka Baidu
ios::in
打开一个可读取文件
ios::out
打开一个可写入文件
ios::app
你写入的所有数据将被追加到文件的末尾,此
T.get(ch); cout << ch; } cout << endl << "--------" << endl; }
void main() {
ifstream T("file1.txt"); read(T); T.close();
T.open("file2.txt"); read(T); T.close(); }
ifstream OpenFile;
OpenFile.open(“hey.txt”);
你会问:它们之间有什么区别吗?哦,我曾做了不少测试,结论是没有区别! 只不过如果你要创建一个文件句柄但不想立刻给它指定一个文件名,那么你可以 使用 open()函数过后进行指定。顺便再给出一个要使用 open()函数的例子:如 果你打开一个文件,然后关闭了它,又打算用同一个文件句柄打开另一个文件, 这样一来,你将需要使用 open()函数。
ofstream SaveFile("file1.txt", ios::ate); SaveFile << "That's new!/n"; SaveFile.close(); }
正如你在表中所看到的:使用 ios::ate 将会从文件的末尾开始执行写入。如 果我没有使用它,原来的文件内容将会被重新写入的内容覆盖掉。不过既然我已
首先,我要指出的是,有很多种方法可以读取文件。以后我会向你们介绍所 有的方法(就我所知的)。此刻,我先向你展示最佳的方法(我认为的)。
正如你已经熟悉的——我将首先给出一段程序代码,然后,我会详细地对它 进行解释说明:
#include <fstream>
void main() //程序从这里开始 {
现在,让我们稍微深入一点点。首先,我要指出的是:ofstream 是一个类。 因此 ofstream SaveFile(“hey.txt”);这一语句将创建一个该类的对象;而我们在括 号中所传递的参数实际上将传给构造函数:在这里我们将我们要建立的文件的名 称作为实际参数传递给了该类的构造函数。当然,我们还可以传递其它的一些信 息,不过我以后再对其进行讲解。
到目前为止,我已为你所展示的只是单一的打开文件的途径:要么为读取而 打开,要么为写入而打开。但文件还可以以其它方式打开。迄今,你应当已经认 识了下面的方法:
ifstream OpenFile(“hey.txt”);
噢,这可不是唯一的方法!正如以前所提到的,以上的代码创建一个类 ifstream 的对象,并将文件的名字传递给它的构造函数。但实际上,还存在有不 少的重载的构造函数,它们可以接受不止一个的参数。同时,还有一个 open() 函数可以做同样的事情。下面是一个以上代码的示例,但它使用了 open()函数:
char ch; —— 声明一个字符数组(array of type char)。只是有一点要提醒 你:这样的数组(arrays)只能存储一个 ASCII 字符。
while(!OpenFile.eof()) —— 如果已经到达文件末尾,eof( )函数将返回一个 非零值。因此我们所设计的这个循环将一直持续,直至我们的文件操作到达文件 末尾。这样我们就可以遍历整个文件,以便对它进行读取。
void main() //程序从这里开始运行 {
ofstream SaveFile(“hey.txt”); SaveFile << “Hello World!”; SaveFile.close(); } 仅仅如此吗?没错!这个程序将在当前运行目录下建立一个名为 hey.txt 的 文件,并向它写入“Hello World!”。
上面的代码创建了一个名为“File”的流式文件的句柄。如你所知,它是 fstream 类的一个对象。当使用 fstream 时,你应当指定 ios::in 和 ios::out 作为文件的打 开模式。这样,你就可以同时对文件进行读、写,而无须创建新的文件句柄。噢, 当然,你也可以只进行读或者写的操作。那样的话,相应地你应当只使用 ios::in 或者只使用 ios::out —— 要思考的问题是:如果你打算这么做,为什么你不分 别用 ifstream 及 ofstream 来实现呢?
考虑以下的代码示例: #include <fstream >
void read(ifstream &T) //pass the file stream to the function {
//the method to read a file, that I showed you before char ch; while(!T.eof()) {
注意:一旦你关闭了一个文件,在你重新打开它之前,你不能再对它进行访 问。
大功告成了!我希望你能明白我的解释。当你编译并运行这个程序的时候, 它应当会输出:
“Hello World!”
掌握输入/输出流
在这一章里,我会提及一些有用的函数。我将为你演示如何打开一个可以同 时进行读、写操作的文件;此外,我还将为你介绍其它打开文件的方法,以及如 何判断打开操作是否成功。因此,请接着往下读!
注意:如果你再次调用该函数,它将读取下一个字符,而不是原来的那一个! 你过后将理解为什么会这样。
这就是我们要不断反复循环直至读操作到达文件尾的原因。每循环一次,我 们将读出一个字符并将它保存在 ch 中。
cout << ch; —— 显示 ch 变量值,它保存了读取得到的字符。
File.close(); —— 我们打开了一个流式文件,就需要关闭它。使用 close() 函数即可将它关闭,这和前一节的一样!
SaveFile << “Hello World!”;—— “<<”看起来是不是很亲切?不错,想必你已 经在 cout << 中见到过。这是一个预定义好的运算符。不管怎么说,这行语句所 做的,是将上面的那段文本写入文件。正如前面所提到的,SaveFile 是一个文 件句柄,它关联一个打开的流式文件。所以,我们只须输入句柄名,再跟着输入 “<<”,然后接着写下一串用引号括起来的文本,就可以实现对文件的写入。如果 我们想写入的是某个变量的值而不是带引号的文本,也只须像通常使用 cout << 一样将变量传递给句柄对象,像这样: SaveFile << variablename; 就可以了!
char ch; while(!OpenFile.eof()) {
OpenFile.get(ch); cout << ch; } OpenFile.close(); }
你想必已经了解首行的意义所在,而剩下的部分将由我为你解释。 ifstream OpenFile(“hey.txt”) —— 我猜它对现在的你而言多少会熟悉些! ifstream 表示“input file stream(输入文件流)”。在前一节的程序中,出现的则是 ofstream,它的意义是“output file stream(输出文件流)”。前一节的程序是进行文 件的写操作,这就是它用“output(输出)”来表示的原因。而本节的程序则是读取 一个文件,这就是它用“input(输入)”来表示的原因。这一行剩下的代码于你而言 应当是熟悉的了:OpenFile 是 ifstream 类的一个对象,它将关联一个输入文件 流;而用引号括住的内容,就是将要打开的文件的名称。 请注意:这里没有对要打开的文件是否存在进行测试!以后我将向你指出如 何进行检测。
方式使用 ios::out
ios::ate
你写入的所有数据将被追加到文件的末尾,此
方式不使用 ios::out
ios::trunk
删除文件原来已存在的内容(清空文件)
ios::nocreate 如果要打开的文件并不存在,那么以此参数调
用 open()函数将无法进行。
ios::noreplace 如果要打开的文件已存在,试图用 open()函
据此,只要 file1.txt 和 file2.txt 并存储了文本内容,你将看到这些内容。
现在,该向你演示的是,文件名并不是你唯一可以向 open()函数或者构造函 数(其实都一样)传递的参数。下面是一个函数原型:
ifstream OpenFile(char *filename, int open_mode);
OpenFile.get(ch); —— OpenFile 是类 ifstream 的一个对象。该类声明了一 个名为 get( )的成员函数。只要我们拥有该对象,我们自然就可以调用这个函数。 get( )函数从相应的流文件中读出一个字符,并将其返回给变量。在本例中,get( )
函数只带一个参数——用于存储所读取的字符的变量。所以,调用 OpenFile.get(ch)后程序将会从 OpenFile 流中读取一个字符并存入变量 ch 中。
我希望现在你已经明白“打开模式”是什么意思了! 现在,是时候向你展示一些真正有用的东西了!我敢打赌你现在还不知道应 当怎样打开一个可以同时进行读取和写入操作的文件!下面就是实现的方法: fstream File(“hey.txt”,ios::in | ios::out);
实际上,这只是一个声明语句。我将在下面数行之后给你一个代码示例。但 此时我首先想提及一些你应当知道的内容。
注意:一旦你关闭文件,在你重新打开它以前,就再不能对它进行访问。
以上就是一个可以写文件的最简单程序。的确很容易!不过,正如你即将在 以后部分的教程中所看到的,还有更多的东西要学呢!
读取文件
你已经看到了应该如何写文件。现在,当我们已经得到 hey.txt 文件时,我 们将要读取它,并且将内容打印在屏幕上。
数打开时将返回一个错误。
ios::binary
以二进制的形式打开一个文件。
实际上,以上的值都属于一个枚举类型的 int 常量。但为了让你的编程生涯 不至于太痛苦,你可以像上表所见的那样使用那些名称。
下面是一个关于如何使用打开模式的例子: #include <fstream >
void main() {
经使用了它,那么我只会在原文件的末尾进行添加。所以,如果 file1.txt 原有的 内容是这样: Hi! This is a test!
那么执行上面的代码后,程序将会为它添上“That’s new!”,因此它看起来将 变成这样: Hi! This is a test!That’s new!
假如你打算设置不止一个的打开模式标志,只须使用 OR 操作符或者是 | , 像这样: ios::ate | ios::binary
SaveFile.close();—— 既然我们打开了一个流文件,那么当我们用完它之 后,就必须关闭它。SaveFile 是 ofstream 类的一个对象,而该类(ofstream)有一 个用于关闭文件的成员函数,即 close() 函数。因此,我们只要依次输入文件句 柄名,点号和 close(),就可以关闭该文件!
C++中的文件输入/输出
简介
本教程将以 C++最基本的文件 I/O(输出/输出)开始。此后,我将从更深入 的方面,为你展示一些技巧,并分析给出一些有用的函数。
你需要对 C++有一个较好的理解,否则这个教程于你而言将是陌生而毫无用 处。
你的第一个程序
首先我将给出一段代码,接着再逐行进行解释。我们的第一个程序将建立一 个文件,并写入一些字符: #include <fstream>
下面给出各行的含义: #include <fstream>—— 你需要包含此文件以使用 C++的文件输入/输出函 数。
ofstream SaveFile(“hey.txt”); 1)ofstream 即“output file stream(输出文件流)”。它将建立一个句柄 (handle),以便我们以后能以一个文件流的形式写入文件。 2)SaveFile—— 这是文件句柄的名字,当然,你还可以换用任何一个你想 要的名称。 3)(“hey.txt”); —— 打开名为 hey.txt 的文件。如果程序运行的当前目录已经 存在这样一个文件,则它将被替换掉;万一不存在,程序也会为你创建一个为文 件,你不必为此而担心。
你应当知道 filename 表示文件的名称(一个字符串),而新出现的则是
open_mode(打开模式)。open_mode 的值用来定义以怎样的方式打开文件。
下面是打开模式的列表:
名称
描述
Biblioteka Baidu
ios::in
打开一个可读取文件
ios::out
打开一个可写入文件
ios::app
你写入的所有数据将被追加到文件的末尾,此
T.get(ch); cout << ch; } cout << endl << "--------" << endl; }
void main() {
ifstream T("file1.txt"); read(T); T.close();
T.open("file2.txt"); read(T); T.close(); }
ifstream OpenFile;
OpenFile.open(“hey.txt”);
你会问:它们之间有什么区别吗?哦,我曾做了不少测试,结论是没有区别! 只不过如果你要创建一个文件句柄但不想立刻给它指定一个文件名,那么你可以 使用 open()函数过后进行指定。顺便再给出一个要使用 open()函数的例子:如 果你打开一个文件,然后关闭了它,又打算用同一个文件句柄打开另一个文件, 这样一来,你将需要使用 open()函数。
ofstream SaveFile("file1.txt", ios::ate); SaveFile << "That's new!/n"; SaveFile.close(); }
正如你在表中所看到的:使用 ios::ate 将会从文件的末尾开始执行写入。如 果我没有使用它,原来的文件内容将会被重新写入的内容覆盖掉。不过既然我已
首先,我要指出的是,有很多种方法可以读取文件。以后我会向你们介绍所 有的方法(就我所知的)。此刻,我先向你展示最佳的方法(我认为的)。
正如你已经熟悉的——我将首先给出一段程序代码,然后,我会详细地对它 进行解释说明:
#include <fstream>
void main() //程序从这里开始 {
现在,让我们稍微深入一点点。首先,我要指出的是:ofstream 是一个类。 因此 ofstream SaveFile(“hey.txt”);这一语句将创建一个该类的对象;而我们在括 号中所传递的参数实际上将传给构造函数:在这里我们将我们要建立的文件的名 称作为实际参数传递给了该类的构造函数。当然,我们还可以传递其它的一些信 息,不过我以后再对其进行讲解。
到目前为止,我已为你所展示的只是单一的打开文件的途径:要么为读取而 打开,要么为写入而打开。但文件还可以以其它方式打开。迄今,你应当已经认 识了下面的方法:
ifstream OpenFile(“hey.txt”);
噢,这可不是唯一的方法!正如以前所提到的,以上的代码创建一个类 ifstream 的对象,并将文件的名字传递给它的构造函数。但实际上,还存在有不 少的重载的构造函数,它们可以接受不止一个的参数。同时,还有一个 open() 函数可以做同样的事情。下面是一个以上代码的示例,但它使用了 open()函数:
char ch; —— 声明一个字符数组(array of type char)。只是有一点要提醒 你:这样的数组(arrays)只能存储一个 ASCII 字符。
while(!OpenFile.eof()) —— 如果已经到达文件末尾,eof( )函数将返回一个 非零值。因此我们所设计的这个循环将一直持续,直至我们的文件操作到达文件 末尾。这样我们就可以遍历整个文件,以便对它进行读取。
void main() //程序从这里开始运行 {
ofstream SaveFile(“hey.txt”); SaveFile << “Hello World!”; SaveFile.close(); } 仅仅如此吗?没错!这个程序将在当前运行目录下建立一个名为 hey.txt 的 文件,并向它写入“Hello World!”。
上面的代码创建了一个名为“File”的流式文件的句柄。如你所知,它是 fstream 类的一个对象。当使用 fstream 时,你应当指定 ios::in 和 ios::out 作为文件的打 开模式。这样,你就可以同时对文件进行读、写,而无须创建新的文件句柄。噢, 当然,你也可以只进行读或者写的操作。那样的话,相应地你应当只使用 ios::in 或者只使用 ios::out —— 要思考的问题是:如果你打算这么做,为什么你不分 别用 ifstream 及 ofstream 来实现呢?
考虑以下的代码示例: #include <fstream >
void read(ifstream &T) //pass the file stream to the function {
//the method to read a file, that I showed you before char ch; while(!T.eof()) {
注意:一旦你关闭了一个文件,在你重新打开它之前,你不能再对它进行访 问。
大功告成了!我希望你能明白我的解释。当你编译并运行这个程序的时候, 它应当会输出:
“Hello World!”
掌握输入/输出流
在这一章里,我会提及一些有用的函数。我将为你演示如何打开一个可以同 时进行读、写操作的文件;此外,我还将为你介绍其它打开文件的方法,以及如 何判断打开操作是否成功。因此,请接着往下读!
注意:如果你再次调用该函数,它将读取下一个字符,而不是原来的那一个! 你过后将理解为什么会这样。
这就是我们要不断反复循环直至读操作到达文件尾的原因。每循环一次,我 们将读出一个字符并将它保存在 ch 中。
cout << ch; —— 显示 ch 变量值,它保存了读取得到的字符。
File.close(); —— 我们打开了一个流式文件,就需要关闭它。使用 close() 函数即可将它关闭,这和前一节的一样!
SaveFile << “Hello World!”;—— “<<”看起来是不是很亲切?不错,想必你已 经在 cout << 中见到过。这是一个预定义好的运算符。不管怎么说,这行语句所 做的,是将上面的那段文本写入文件。正如前面所提到的,SaveFile 是一个文 件句柄,它关联一个打开的流式文件。所以,我们只须输入句柄名,再跟着输入 “<<”,然后接着写下一串用引号括起来的文本,就可以实现对文件的写入。如果 我们想写入的是某个变量的值而不是带引号的文本,也只须像通常使用 cout << 一样将变量传递给句柄对象,像这样: SaveFile << variablename; 就可以了!