一、读写文件
先用cin输入student的信息,写入文本文件中(outfile);
然后又将信息从文本文件中读出来(infile),用cout输出到黑窗口。
总结精华:
1.写文件
ofstream outfile(文件名,ios::out)
如果没有这个文件,系统将自动构建
先cin变量的信息,然后outfile<<插入到流中,从而写入文件
2.读文件
ifstream infile(文件名,ios::in)
先infile>>从文件中提取信息赋给变量,再cout变量的值
(infile>>类似cin>>,可以自动跳过空格和换行符)
3.无论读写,都是三步走
1打开文件(如果打不开,就要退出文件) 2文件读或写 3关闭文件
以一个包含学生学号、姓名、成绩的文本文件为例 。
写入时一行放一个学生记录,读取时求最高分、最低分和平均分。
#include<iostream>
#include<fstream>//包含头文件
using namespace std;
struct student
{
int num;
char name[20];
double score;
};
int main()
{
char filename[20];
cin >> filename;
//1.写入文件
ofstream outfile(filename, ios::out);//写方式打开文件
if (!outfile)
abort();//打不开则退出
outfile << "student manager data\n"; //写文本标题
student t;
while (cin >> t.num >> t.name >> t.score)//按control+Z结束输入
{
outfile << t.num << ' ' << t.name << ' ' << t.score << '\n'; //写入文本文件流中
}
outfile.close();
//2.读文件
ifstream infile(filename, ios::in);//读方式打开
if (!infile)
abort();
char s[80];
infile.getline(s, 80);//略去标题行
student r;
double total=0;int n = 0;//用于记录平均分
double min, max;
while (infile >> r.num >> r.name >> r.score)
//infile相当于cin,可以无视空格和换行
//读到eof时会自动结束
{
cout << r.num << ' ' << r.name << ' ' << r.score << endl;
if (n == 0)min = max = r.score;//用第一次输入的score给min和max赋初值
if (r.score > max)max = r.score;
if (r.score < min)min = r.score;
total += r.score;n++;
}
double avg = total / n;
cout << "max=" << max << " min=" << min << " avg=" << avg << endl;
infile.close();
return 0;
}
二、 追加记录
ofstream outfile;
outfile.open(filename,ios::app);//追加方式打开文件
注意:此前在写入文件的输入中,while中需加入if(num==0) break;来结束cin的输入;
若继续以按下ctrl+Z来结束输入,则会因为输入流中已有EOF而不能继续输入。
其余与写入文件无异。
//3.追加记录
outfile.open(filename, ios::app);//追加方式打开文件
if (!outfile)
abort();
char ch;
cin >> ch;//用户应答,输入y则继续追加,输入其他则结束输入
student t1;
while (ch == 'y')
{
cin >> t1.num >> t1.name >> t1.score;
outfile << t1.num << t1.name << t1.score;
cin >> ch;
}
三、浏览文件
ifstream infile;
infile.open(filename,ios::in);
注意:此处浏览文件是指单纯的读文件,而不需将信息赋给变量
按行读取:
char s[80];
infile.getline(s,80);
//4.浏览文件
infile.open(filename, ios::in);//依然是读方式打开文件
if (!infile)
abort();
char s1[80];//确保s1的空间足以装下一整行字符
while (!infile.eof())//未达到文本末尾时
{
infile.getline(s1, 80);//按行读出文件
cout << s1 << endl;//然后输出
}
四、复制文件
用inf.get(char)将字符从源文本中读出,
再用outf.put(char)将字符写入另一个文本中,
即完成复制。
为什么不用getline呢,因为好像没有一下子写入一行字符串的函数吧???
//5.复制文件
ifstream inf("data.dat", ios::in);//读方式打开源文件
ofstream outf("data1.dat", ios::out);//写方式打开要写入的目标文件
if (!inf || !outf)
abort();
char c;
while (inf.get(c))//全部字符复制
{
outf.put(c);
}
inf.close();
outf.close();