C ++文件I / O - 程序暂停

时间:2012-07-01 22:41:35

标签: c++ input

我在这里做作业问题我一直在努力;这是描述:

  

编写一个程序,读取一个由学生的考试成绩组成的文件   范围0-200。然后应该确定学生的数量   以下每个范围内的得分:0-24,25-49,50-74,75-99,   100-124,125-149,150-174和175-200。输出得分范围   和学生人数。 (使用以下输入运行程序   数据:76,89,150,135,200,76,12,100,150,28,178,189,167,200,   175,150,87,99,129,149,176,200,87,35,157,189。)

以下是我制作的节目:

#include <iostream>
#include <fstream>
using namespace std;

int main() 
{
//declaring variables
ifstream myfile("data.txt");
double grades[26];
int i, studentNumber=0;
int score0_24=0, score25_49=0, score50_74=0,
    score75_99=0, score100_124=0, score125_149=0,
    score150_174=0, score175_200=0;

cout << score150_174 << endl;

//initializing grades array
for(i=0; i<26; i++)
{
    grades[i] = 0;
    cout << grades[i] << " ";
}

//getting data from text file
    for(i=0; i<26; i++)
        {
            myfile >> grades[i];
            cin.ignore(2);
            studentNumber++;
        }

    myfile.close();

//finding number of people for each score range
for(i=0; i<26; i++)
{
    if(grades[i] <= 24)
        score0_24++;
    if(grades[i] >= 25 && grades[i] <= 49)
        score25_49++;
    if(grades[i] >= 50 && grades[i] <= 74)
        score50_74++;
    if(grades[i] >= 75 && grades[i] <= 99)
        score75_99++;
    if(grades[i] >= 100 && grades[i] <= 124)
        score100_124++;
    if(grades[i] >= 125 && grades[i] <= 149)
        score125_149++;
    if(grades[i] >= 150 && grades[i] <= 174)
        score150_174++;
    if(grades[i] >= 175 && grades[i] <= 200)
        score175_200++;
}

//outputing results
cout << "Number of students: " << studentNumber << endl;
cout << "0-24: " << score0_24 << endl;
cout << "25-49: " << score25_49 << endl;
cout << "50-74: " << score50_74 << endl;
cout << "75-99: " << score75_99 << endl;
cout << "100-124: " << score100_124 << endl;
cout << "125-149: " << score125_149 << endl;
cout << "150-174: " << score150_174 << endl;
cout << "175-200: " << score175_200 << endl;

return 0;
}

我所拥有的文件与该项目位于同一文件夹中,名为:

  

data.txt中

并包含以下内容:

  

76,89,150,135,200,76,12,100,150,28,178,189,167,200,175,150,87,99,129,149,176,200,87,35 ,157,189

当我运行程序时,它会在for循环中挂起,我从文件中读取数据。我之前和之后都尝试过做一些cout语句,似乎问题就出现了。

帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

我有一些建议给你,虽然你没有问过:)......

1)不要先收集等级然后再处理它们,而是将你的循环合并为1,这样一旦你读到了你用它做的事情的价值。这样就无需使用grades数组和大约一半的代码。

2)不要硬编码26个等级,而是从文件中读取,直到最后:

for(int grade = 0; myFile >> grade; )
{
    if(myFile.peek() == ',')
         myFile.ignore(); // <--- this is why your version wasn't working (you were calling cin.ignore instead)

    // do something with grade here
}

3)不是为0-24,25-49等创建8个计数器,而是创建一个8的数组,并使用整数数学来确定要访问的索引。

通过这些更改,您应该能够将其降低到15-20行干净的可读代码。

答案 1 :(得分:0)

**File to read in named test.txt located @ c:\\users\\desktop\\test.txt**

76 89 150 135 200 76 12 100 150 28 178 189 167 
200 175 150 87 99 129 149 176 
200 87 35 157 189
----------------------------------------------------------
#include <iostream>
#include <fstream>

using namespace std;
int main()
{
    ifstream infile;
    int scores[26] = { 0 };  
    int scoreCount[8] = { 0 };
    

   infile.open("c:\\users\\desktop\\test.txt");
   if (infile)
        for (int i= 0; i < 26; i++) {    //read file txt into scores array
            infile >> scores[i];
            if (!infile)
                break; }

   
   for (int i = 0; i <= scores[i]; i++) {  //index score count into scoreCount array
       int index = scores[i] / 25;
       if (index >= 0 && index < 8)
            scoreCount[index]++;
                else if (scores[i] == 200)
                    scoreCount[7]++; }
   
   int min = 0;
   int max = 24;
   
   for (int i = 0; i < 8; i++) {              //print ranges & score count
       cout << min << " - " << max << " ";
       cout << scoreCount[i];
       cout << endl;
       min += 25;
       max += 25;
       if (max == 199) max = 200; }
    
infile.close();

return 0;
}