文件数据处理
一.前言:
文件是根据特定的目的而收集在一起的有关数据的集合。
例如:关于学生信息的文件
有姓名,成绩,生日,身份证号码等。
文件的分类:
1.文本文件
2.二进制文件
文件操作的大致步骤:
1.新建一个文件流对象。
2.把文件流对象和文件关联起来,打开文件。
3. 操作文件流。
4. 关闭文件流。
二.例子:
题目:
小明班长有一份成绩记录的文件,格式为每行由一名同学的名字和若干门课程的成绩,同学门选课的数目不同。
要求:编写一个程序,计算每名同学的平均成绩,并将结果保存在另一份文件,格式为每行一名学生的姓名,总分,课程数,平均分。
分析:
步骤1:逐行地读取小明手中的文件中的数据,并分别提取其中的名字和成绩。
步骤2:计算出总成绩,在计算出平均分。
步骤3:按要求逐行地写文件。
(1) 如何保存读取出的数据?
答: 用结构体保存。
一名学生的信息: 名字 + 成绩
struct students{
string name; //某同学的名字。
vector<int> cj; //科目数目未知。
};
整个班级的成绩表:
vector tongxue;
(2) 如何读写文件?
ifstream类:istream的派生类,用来输入(读文件)的文件流。
ofstream类:ostream的派生类,用来输出(写文件)的文件流。
fstream类:iostream的派生类,把文件连接到流对象用来输入和输出(读写)。
头文件:
istringstream: istream的派生类,用来从string对象中读取数据。
ostringstream:ostream的派生类,用来向string对象写入格式化的内容。
stringstream:iostream的派生类,既可以从字符串读取数据,也可以将数据写入字符串。
头文件:<sstream> 包含两个特别操作:
1. 返回字符串流strm中保持的字符串的副本
strm.str();
2. 将字符串s复制到字符串流strm中,返回void。
strm.str(s);
具体代码:
#include
#include
#include
#include
#include
using namespace std;
struct students{
string name;
vector cj;
};
int main()
{
vector tongxue;
ifstream in(“cj.txt”); //定义对象和打开文件一步完成。
while(!in.eof())
{
students x;
string shuju;
getline(in,shuju); //读取一行文件,即一个学生的所以数据;
if(shuju.empty())
{
continue; // 略过空行
}
istringstream is(shuju);
//用字符串流逐行提取学生的数据。
is >> x.name; //姓名;
int score;
while(is >> score)
{
x.cj.push_back(score);
}
tongxue.push_back(x);
}
in.close();
ofstream out(“pjf.txt”); //打开输出文件准备写结果;
for(int i = 0; i != tongxue.size(); ++i)
{
ostringstream xinxi("");
xinxi<< (tongxue[i].name) << " ";
int sum = 0;
for(int y=1 ; y != tongxue[i].cj.size(); ++y)
{
sum += tongxue[i].cj[y];
}
double pingjun;
int KMnumber= tongxue[i].cj.size();
if(KMnumber != 0)
{
pingjun = (sum*1.0)/(KMnumber);
}
else
{ pingjun = 0; }
xinxi.precision(1);
xinxi<<sum<<" “<<KMnumber
<<” "<<fixed<<pingjun;
out<<xinxi.str()<<endl;
}
out.close(); r
eturn 0;
}