почему первая строка файла данных пропускается c ++ - PullRequest
0 голосов
/ 11 ноября 2018

При выполнении этого цикла для моего школьного задания кажется, что он пропускает первую строку файла данных, из которого я извлекаю данные.

Вот файл данных
Джо Джонсон 89 Сьюзи Колдуэлл 67 Мэтт Бейкер 100 Алекс Андерсон 87 Перри Диксон 55

Вывод, который я получаю:

Колдуэлл, Сьюзи Д Бейкер, Мэтт А Андерсон, Алекс Б Диксон, Перри Ф Средний класс 77,25

Вот код.

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

    using namespace std;







    int main()
    {
        // Variable declarations: 
        string fName[10];
        string lName[10];
        float grade_Average;
        string file;
        string name;
        int scores[10];
        float sum = 0;
        char grade;
        int i = 0;



        ifstream din;


        // Function body: 

        cout << "Enter the name of the file. " << endl;
        cin >> file;

        din.open(file.c_str());

        if (!din)
        {
            cout << " Cannot open the input file. Please try again." << endl;
            return 0;
        }

        cout << setw(10) << setfill(' ')  << "Name" <<setw(20)<<setfill(' ')<< "Grade" << endl;
        din >> fName[i];
        din >> lName[i];
        din >> scores[i];
        while (!din.eof())
        {

            i++;
            din >> fName[i];
            din >> lName[i];
            din >> scores[i];

            sum = sum + scores[i];


            switch (static_cast<int> (scores[i]/10))
            {
            case 0:
            case 1:
            case 2:
            case 3:
            case 4:
            case 5:
                grade = 'F';
                break;
            case 6:
                grade = 'D';
                break;
            case 7:
                grade = 'C';
                break;
            case 8:
                grade = 'B';
                break;
            case 9:
                grade = 'A';
                break;
            case 10:
                grade = 'A';
                break;
            default:
                cout << "Invalid score." << endl;



            }

            name = lName[i] + ',' + fName[i];
            cout << setw(10) << setfill(' ') << name  << setw(20) << setfill(' ')<<(" ") << grade << endl;


        } 
        grade_Average = sum / i;
        cout << "Class average " << grade_Average << endl;


        din.close();

        return 0;
    }
     // end function main

1 Ответ

0 голосов
/ 11 ноября 2018

Первая строка не пропускается, но вы никогда не печатаете никаких результатов для нее:

    din >> fName[i];
    din >> lName[i];
    din >> scores[i];
    while (!din.eof())
    {

        i++;

Обратите внимание, что в первых трех строках приведенного выше кода вы читаете значения fName[0], lName[0] и scores[0], но затем увеличиваете i (внутри цикла while) и никогда не смотрите на них. значения снова.

Вам лучше удалить эти три строки и вместо этого переместить строку i++; в конец цикла while.

...