文件数据处理

一.前言:

文件是根据特定的目的而收集在一起的有关数据的集合。
例如:关于学生信息的文件
有姓名,成绩,生日,身份证号码等。

文件的分类:
1.文本文件
2.二进制文件

文件操作的大致步骤:
1.新建一个文件流对象。
2.把文件流对象和文件关联起来,打开文件。
3. 操作文件流。
4. 关闭文件流。

二.例子:
题目:
小明班长有一份成绩记录的文件,格式为每行由一名同学的名字和若干门课程的成绩,同学门选课的数目不同。
要求:编写一个程序,计算每名同学的平均成绩,并将结果保存在另一份文件,格式为每行一名学生的姓名,总分,课程数,平均分。

分析:
步骤1:逐行地读取小明手中的文件中的数据,并分别提取其中的名字和成绩。
步骤2:计算出总成绩,在计算出平均分。
步骤3:按要求逐行地写文件。

(1) 如何保存读取出的数据?
答: 用结构体保存。
一名学生的信息: 名字 + 成绩

struct students{  

      string name;  //某同学的名字。 
           vector<int> cj;  //科目数目未知。
   }; 
    整个班级的成绩表:  
             vector<students> tongxue; 

(2) 如何读写文件?

 ifstream类:istream的派生类,用来输入(读文件)的文件流。
 ofstream类:ostream的派生类,用来输出(写文件)的文件流。
 fstream类:iostream的派生类,把文件连接到流对象用来输入和输出(读写)。
   头文件:<fstream>
   
    istringstream: istream的派生类,用来从string对象中读取数据。
    ostringstream:ostream的派生类,用来向string对象写入格式化的内容。
    stringstream:iostream的派生类,既可以从字符串读取数据,也可以将数据写入字符串。 
    头文件:<sstream>  包含两个特别操作:
    1. 返回字符串流strm中保持的字符串的副本  
        strm.str();
    2. 将字符串s复制到字符串流strm中,返回void。  
       strm.str(s);  

具体代码:

 #include<iostream>
#include<vector>
#include<string>
#include<fstream>
#include<sstream> 

using namespace std; 
struct students{ 
     string name; 
          vector<int> cj;
 };

int main()
{     
      vector<students> 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;
           }
  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力的clz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值