资源描述
第九章 文件
常用的文件有两类,一类是程序文件,如c++的源程序文件(.cpp)等,另一类是数据文件。在程序运行时,常常需要将一些数据输出到磁盘中存放起来,以后需要时再从磁盘中输入到计算机内存。这种磁盘文件就是数据文件。程序中的输入和输出的对象就是数据文件。
根据文件数据的组织形式,可分为ASCII文件和二进制文件。
对数据文件读或写,都要先建立或打开这个数据文件。
C++语言把文件看成有序ASCII码,建立和打开一个文件,实现简单的文件输入和输出操作。 在C++语言中能够比较简单实现对文件的输入、输出操作。 在这章里,会详细解释ASCII文件的输入输出的每个细节。ASCII文件又称文本文件或字符文件。它的每个字节放一个ASCII码,代表一个字符。二进制文件不经常使用,就不介绍了。
由程序进行文件处理时,必须要包含头文件<fstream>。这个文件定义了文件处理相关的指令,使用时与cin 和cout非常相似。
一、把数据写到指定的文件
把数据输出到文件,要用输出文件流,建立与某个文件相关联的输出文件流,可以使用下面的语句:
Ofstream 变量名(”文件名”)
Ofstream表示输入文件流,用来声明变量的类型。括号中的数据是对这个输出文件流进行初始化。文件名可包括路径和文件名,告诉计算机这个输出文件对应磁盘上的哪个文件。例如
ofstream fout("e:\dev-c++\one.out");
定义了一个输出文件流fout,同时把one.out文件与fout相关联。对fout的操作就是对one.out文件的操作。通过对fout的操作,把数据写入到文件并保存起来。
完成文件操作后,应该把文件关闭。关闭文件的方法是:fout.close();
即调用文件流的成员函数close().
关闭文件是解除one.out磁盘文件与fou流的关联,原来设置的工作方式也随之失效。这样就不能通过文件流对one.out文件进行输出操作了。
二、从指定文件中读取数据
从文件中读取数据可以使用输入文件流,建立与某文件相关联输入文件流。
例如:ifstream fin(“文件名”);
当文件名为one.in时,什么语句表述为:ifstream fin(“one.in”);
定义了一个输入文件流fin,同时把one.in文件与fin相关联。对fin的操作就是对one.in文件的操作。通过对fin的操作,把数据写入到内存中。
完成文件操作后,应该把文件关闭。关闭文件的方法是:fin.close();
应用举例
[例1]、总留空时间(shi.cpp)
【问题描述】未来工程师的竞赛中,设计的飞船在空中可以逐个放出纸蜻蜓,每个纸蜻蜓在空中飘的时间有长有短。从第一个放出的纸蜻蜓开始降落时间到全部纸蜻蜓接触地面的时间的差的绝对值,叫总留空时间。
【输入文件】
文件名:time.in 。文件中有二行,第一行只有一个整数n,是纸蜻蜓的个数。不用判断n的合理性。1<=n<=1000.
第二行有n对用一个空格分隔的整数,是每只纸蜻蜓的开始降落时间和接触地面的时间。
【输出文件】
文件名:time.out 。只有一个整数。从第一行第一列的位置开始输出总留空时间。
【举例】
time.in 内容:
3
4 17
2 10
5 11
time.out内容如下
15
参考程序如下:
#include <iostream>
#include <fstream>//输入、输出文件库
using namespace std;
ifstream fin("shij.in");//将外部文件shij.in与fin建立联系,对fin的操作,就是对//shij.in的操作。
ofstream fout("shij.out");//同上,对fout的操作就是对shij.out文件的操作。
int main()
{ int n,i,max,min,x,y;
max=-1;min=32768;
fin>>n;//读入数据行数
for(i=1;i<=n;i++)
{
fin>>x>>y;//每行读入两个数
if(x<min)min=x;//找最小值
if(y>max)max=y;//找最大值
}
fout<<max-min<<endl;//总滞空时间
fin.close();//关闭输入文件
fout.close();//关闭输出文件
return 0;
}
[例2]、数手指中的学问:
【问题描述从右手拇指开始从右向左数, 数1大母指,数2食指,数3中指,数4无名指数,数5小指数。此时开始从左向右数,无名指数6,中指数7,食指数8,拇指数9,再改变方向,食指数10,中指数11,无名指数12,小指数13,再改变方向,无名指数14,中指数15,食指数16,拇指数17……。
按上述规律,如果随便说出一个数,你能够立即指出它应落在哪个手指上吗?例如33,应落在拇指上。
试设计程序解决这个问题。
从文件”shouzhi.in”中读入个数字,输出到文件“shouzhi.out”中,是哪个手指。
例如:
【输入文件】
shouzhi.in
33
【输出文件】
shouzhi.out
mu zhi
参考程序如下:
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("shouzhi.in");
ofstream fout("shouzhi.out");
int main()
{ int n,i,j;
char a[8]={'s','m','s','z','w','x','w','z'};
fin>>n;
j=n%8;
switch(a[j])
{
case 's':fout<<"shi zhi"<<endl;
break;
case 'm':fout<<"mu zhi"<<endl;
break;
case 'z':fout<<"zhong zhi"<<endl;
break;
case 'w':fout<<"wu ming zhi"<<endl;
break;
case 'x':fout<<"xiao zhi"<<endl;
break;
defanlt: fout<<"error"<<endl;
break;
}
fin.close();
fout.close();
return 0;
}
文件读写的一些概念:
ofstream fout("file.dat", ios::binary);
"ios::binary"是你提供的打开选项的额外标志. 默认的, 文件以ASCII方式打开, 不存在则创建, 存在就覆盖. 这里有些额外的标志用来改变选项。
ios::app 添加到文件尾
ios::ate 把文件标志放在末尾而非起始。
ios::trunc 默认. 截断并覆写文件。
ios::nocreate 文件不存在也不创建。
ios::noreplace 文件存在则失败。
文件状态
一个状态函数是eof(), 它返回是否标志已经到了文件末尾。 主要用在循环中。 例如, 这个代码断统计小写‘e’ 在文件中出现的次数。
ifstream fin("file.txt");
char ch; int counter;
while (!fin.eof())//如果文件没有到文件尾,则执行循环题,否则不循环。
{
ch = fin.get();
if (ch == ‘e’) counter++;
}
fin.close();
fout.close();
展开阅读全文