回 帖 发 新 帖 刷新版面

主题:C++ 在做读取文档的时候输出处理遇到了瓶颈了...帮帮忙

/* 
    这是一个命令行程序 
    要求是写一个命令行程序去读取test.txt文档里面的资料输出学生成绩 
    文档每行头两个是姓和名 之后 是各个成绩 最后以为是任意负数,当做 
    循环结束的控制元素. 行数长度都不固定. 

    输出格式是 
------------------------ 
    学生姓名: mary lin 
    成绩: 40 60 50 
    mary lin, 平均 50, 成绩 F. 
------------------------ 
    学生姓名: andy chen 
    成绩: 60 70 80 90 
    mary lin, 平均 75, 成绩 C. 
------------------------ 
    学生姓名: andy chen 
    成绩: 60 70 80 90 
    mary lin, 你没有考试成绩. 
------------------------ 
    学生姓名: andy chen 
    成绩: 80 100 
    mary lin, 平均 90, 成绩 A. 
------------------------ 
...等等... 

我写的程序只可以完整读出第一个人的资料, 我从循环去做,但是失败了... 
我应该怎么改写这个程序呢? ...希望有人可以帮忙... 
试过使用getline, 但是一行里面又有string又有int, 不确定改怎么分开... 
刚开始学C++, 还抓不到设计思路.. 
会不会是我已开始思路就走错了? 


/////////////读取的test.txt内容//////////////////// 

mary lin 40 60 50 -1 
andy chen 60 70 80 90 -2 
jacky wang -4 
leo he 80 100-7 

///////////////////////////////////////////////// 
*/ 


///////////////////////程式码//////////////////// 


#include <iostream> 
#include <fstream> 
#include <string> 

using namespace std; 

int main ( ) 


            string  filelines ; 
            string firstName,lastName; 
    double Average = 0.0; 
    double total = 0.0; 
    char Grade; 
    int score[100]; 

        cout < < "\n================================================================="; 
        cout < < "\n                                WilliamC's Grade Calculator"; 
cout < < "\n================================================================="; 
cout < < "\nThis program will process test scores to provide individuals \nwith letter grades according to the following scale: "; 
cout < < "\n================================================================="; 
cout < < "\n          90    <    average              A"; 
cout < < "\n          80    <    average    <= 90    B"; 
cout < < "\n          67.5  <    average    <= 80    C"; 
cout < < "\n          55    <    average    <= 67.5  D"; 
cout < < "\n          0      <=    average    <= 55    F"; 
cout < < "\n=================================================================\n"; 




////////////////////////////////////////////////////////////////////////////////////////// 


ifstream fin("test.txt"); 

while (!fin.eof()){              //尝试使用循环, 但是不确定可不可以用 


getline(fin,line);              //最大的问题点...我不知道怎么用getline 



          for (int k = 0; k < 100 ; k ++){ 
  score[k] = -1; 
  }                                                  //  预防文档里有0分, 所以先设定成负数. 

      fin >> firstName >> lastName;      // 取得一行的姓名 

for (int j = 0;j < 100 ; j ++){ 
fin >> score[j]; 
}                                                // 取得成绩数列 

    if(score[0] < 0){                        // 没成绩时的处理 

cout < < "Your name is    : " < < firstName < < " " < < lastName < < '\n'; 
cout < < '\n' < < firstName < < " " < < lastName < < "You Do Not Have Any Score."; 

}else{                                  

        cout < < "Your name is    : " < < firstName < < " " < < lastName < < '\n'; 
                        cout < < "Your scores are : "; 
                        int w = 0; 
                  while(score[w] >= 0){ cout < < score[w] < < " "; total = total + score[w];w++;}    //用for循环显示成绩数组 

        Average = total / w; 

        if ( Average > 90)                                  // 计算成绩 
                      Grade = 'A'; 
                  if (Average > 80) 
                    Grade = 'B'; 
              if (Average > 67.5) 
                      Grade = 'C'; 
              if (Average > 55) 
                Grade = 'D'; 
              else 
                      Grade = 'F'; 
        
                      cout < < '\n' < < firstName < < " " < < lastName < < ", your average is " < < Average < < " and your letter grade is " < < Grade;      //输出 

                  } 
          } 


/////////////////////////////////////////////////////////////////////////////////////////// 

        cout < < "================================================================="; 
cout < < "\nThank you for using WilliamC's Grade Calculator."; 

}

回复列表 (共3个回复)

沙发


不知道你为什么要用ifstream fin("test.txt"); 用CFILE来打开文件
用CFILE::READ()来读取,不行吗?

板凳

可以使用 istringstream 类
可以直接从文件里读出格式化好的数据.

具体实现可以到网上找代码.

3 楼

1、楼主关键是要掌握string类的getline函数和字符串流stringstream的使用方法。读取文本行的getline函数应放入while循环判断条件中,使用istringstream时需加入头文件#include <sstream>。
2、使用vector容器存放成绩很方便,不必预先设定静态数组。
3、对文件流应加入有效性判断,以便处理假设文件不存在和不能正确打开时的异常。
4、请避免使用cout<<"\n"的输出形式,因为它不能保证输出流的及时刷新显示,应使用cout<<endl的形式。

修改后的代码如下:

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

using namespace std; 

int main() 

    cout << "================================================================="<<endl;
    cout << "                WilliamC's Grade Calculator"<<endl;
    cout << "================================================================="<<endl; 
    cout << "This program will process test scores to provide individuals "<<endl;
    cout << "with letter grades according to the following scale:"<<endl;
    cout << "          90    <    average             A"<<endl;
    cout << "          80    <    average    <= 90    B"<<endl;
    cout << "          67.5  <    average    <= 80    C"<<endl;
    cout << "          55    <    average    <= 67.5  D"<<endl;
    cout << "          0     <=    average   <= 55    E"<<endl;
    cout << "================================================================="<<endl;
    ifstream fin("test.txt"); 
    if(!fin)
    {
        cerr<<"can not open file \"test.txt\" !"<<endl;
        return -1;
    }
    string strLine;
    while(getline(fin,strLine))
    {
        istringstream iss(strLine);
        string firstName,lastName;
        iss>>firstName>>lastName;
        vector<double> dvec;
        double score;
        while(iss>>score)
        {
            if(score>=0)
            {
                dvec.push_back(score);
            }
            else
            {
                break;
            }
        }
        cout<<"学生姓名:"<<firstName<<" "<<lastName<<endl;
        if(!dvec.size())
        {
            cout<<"没有成绩!"<<endl;
        }
        else
        {
            cout<<"成绩:";
            double total=0;
            for(vector<double>::const_iterator iter=dvec.begin();iter!=dvec.end();++iter)
            {
                cout<<*iter<<" ";
                total+=*iter;
            }
            cout<<endl;
            double average=total/dvec.size();
            char grade;
            if(average>90)
                grade='A';
            else
                if(average>80)
                    grade='B';
                else
                    if(average>67.5)
                        grade='C';
                    else
                        if(average>55)
                            grade='D';
                        else
                            grade='E';
            cout<<"平均:"<<average<<" 等级:"<<grade<<endl;
        }
        cout<<endl;
    } 
    cout << "================================================================="<<endl;
    cout << "Thank you for using WilliamC's Grade Calculator."<<endl;
    return 0;


我来回复

您尚未登录,请登录后再回复。点此登录或注册