нерегулярная картина - PullRequest
0 голосов
/ 28 ноября 2011

У меня проблемы с определением, где именно мой файл вводится неправильно. Вот код:

  char tempFirst[20], tempLast[20], tempCourse[7];
  char c;          // For peeking


  // Find out how many students are in the file
  inFile >> numStudents;

  for (int i = 0; i < numStudents; i++)
    {
      // Get last name from file
      inFile.getline(tempLast, 20, ',');

      // Gets rid of any spaces inbetween last and first
      while (isspace(inFile.peek()))
        c = inFile.get();
      // Get first name from file
      inFile.getline(tempFirst, 20, '\n');

      // New line, get course
      inFile >> tempCourse;

      // PRINT
      cout << tempFirst << "\n" << tempLast << "\n"
             << tempCourse << "\n";

      list[i]->SetGrades(inFile);
    }

SetGrade приводит к одной из этих трех унаследованных функций:

void EnglishStudent::SetGrades(ifstream& inFile)
{
  inFile >> attendance >> project >> midterm >> final;
  cout << attendance << " " << project << " " << midterm << " " << final << "\n\n";
}

void HistoryStudent::SetGrades(ifstream& inFile)
{
  inFile >> paper >> midterm >> final;
  cout << paper << " " << midterm << " " << final << "\n\n";
}

void MathStudent::SetGrades(ifstream& inFile)
{
  inFile >> quiz1 >> quiz2 >> quiz3 >> quiz4 >> quiz5
         >> test1 >> test2 >> final;
  cout << quiz1 << " "<< quiz2 << " " << quiz3 << " " << quiz4 << " " << quiz5
       << " " << test1 << " " << test2 << " " << final << "\n\n";
}

Вот файл, из которого я загружаю информацию:

6
Bunny, Bugs
Math 90 86 80 95 100 99 96 93
Schmuckatelli, Joe
History 88 75 90
Dipwart, Marvin
English 95 76 72 88
Crack Corn, Jimmy
Math 44 58 23 76 50 59 77 68
Kirk, James T.
English 40 100 68 88
Lewinsky, Monica
History 60 72 78

Тогда вот вывод:

Bugs

Bunny
Math
90 86 80 95 100 99 96 93

Joe

History
88 75 90

Marvin

English
95 76 72 88

Jimmy

Crack Corn
Math
44 58 23 76 50 59 77 68

James T.

English
40 100 68 88

Monica

History
60 72 78

Я скучаю по большинству фамилий, и для первого студента в имени есть конечная строка. Как мне исправить это?

Ответы [ 2 ]

1 голос
/ 28 ноября 2011

пропустить остаток текущей строки, прежде чем перейти к следующей строке

   inFile >> numStudents;
    std::string line;
    std::getline(inFile, line);//read the rest of the first line, you should do this before you start to read next line
    for (int i = 0; i < numStudents; i++)
    {
        std::getline(inFile, line); //line contains first name and last name
        size_t pos = line.find(",");
        std::cout << line.substr(0, pos) << std::endl //first name
            << line.substr(pos + 2) << std::endl; //last name,skip ", "
        std::getline(inFile, line); // course name and grades
        //you could split the course name and grades now with line
        std::cout << line << std::endl;
    }
1 голос
/ 28 ноября 2011

Дело не в том, что в имени в конце стоит новая строка, а в начале фамилии.Когда int s считываются из ввода, все обнаруженные пробелы, которые отмечают конец int, остаются во входном потоке.

Чтобы это исправить, либо удалите пробелы перед чтением фамилии,в методах SetGrades или в конце цикла.Последние два также потребуют удаления пробелов после прочтения numStudents.Самый простой способ удаления пробелов - использовать ws потоковый манипулятор .Все, что для этого нужно:

inFile >> ws;

Вы также можете заменить цикл peek этим.

Замените массивы символов на строки для более подлинного опыта C ++.Это также требует замены ifstream::getline функцией getline free.В качестве бонуса ваш код будет работать для имен длиннее 19 символов.

    std::string tempFirst, tempLast, tempCourse;

    ...
    for (int i=0; i < numStudents; ++i) {
        inFile >> std::ws;
        getline(inFile, last, ',');

        inFile >> std::ws;
        getline(inFile, first, '\n');
        ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...