简体   繁体   中英

C++ File I/O - Program suspends

I have a homework problem here I've been working on; here is the description:

Write a program that reads a file consisting of students' test scores in the range 0–200. It should then determine the number of students having scores in each of the following ranges: 0–24, 25–49, 50–74, 75–99, 100–124, 125–149, 150–174, and 175–200. Output the score ranges and the number of students. (Run your program with the following input data: 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.)

The following is the program I have made:

#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;
}

And the file I have, which is in the same folder as this project, is called:

data.txt

And contains the following:

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

When I run the program, it suspends during the for loop where I read data from the file. I've tried doing some cout statements right before and after, and it seems that is the problem.

Help would be appreciated.

I have a few recommendations for you, though you didn't ask :)...

1) Instead of collecting the grades first and then processing them, combine your loops into 1 so as soon as you read the value you do something with it. This removes the need to have your grades array and about half your code.

2) Instead of hard-coding 26 grades, read from the file until you're at the end:

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) Instead of creating 8 counters for 0-24, 25-49, etc, create an array of 8 and use integer math to figure out what index to access.

With those changes you should be able to get this down to 15-20 lines of clean readable code.

**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;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM