Преобразование оператора istream ›› в istream getline

Я пытаюсь прочитать строки из файла, используя istream& getline вместо istream& operator.

CPP результата

#include "Result.h"

Result::Result()
{
    Coursename[0] = '\0';
}

Result::Result( const char * nam, unsigned scor )
{
    strncpy( Coursename, nam, CourseNameSiz );

    score = scor;
}
//istream& getline( istream & input, Result & Re, ',' )
istream & operator >>( istream & input, Result & Re )
{
  //getline(Re.Coursename, input, ',');
  input >> Re.Coursename >> Re.score;
  return input;
}

ostream & operator <<( ostream & os, const Result & Re )
{
  os << "  Unit Name:  " << Re.Coursename << '\n'
     << "  Result: " << Re.score << '\n';
  return os;
}

int Result::GetScore() const
{
  return score;
}

inline void Result::SetScore( unsigned scor )
{
  score = scor;
}

заголовок результата

#ifndef RESULT_H
#define RESULT_H

#include <iostream>
#include <string.h>
#include <string>

using namespace std;

const unsigned CourseNameSiz = 10;

class Result
{
    public:

        Result();

        Result( const char * nam, unsigned scor );

        int GetScore() const;
        // Get the number of s.

        void SetScore( unsigned scor );
        // Set the number of score.
        //string Result:GetCourseName() const;

        friend ostream & operator <<( ostream & os, const Result & Re );
        //friend istream & getline( istream & input, Result & Re, ',' );
        friend istream & operator >>( istream & input, Result & Re );

    private:
        char Coursename[CourseNameSiz];
        //string Coursename[CourseNameSiz]; // Unit name, C style string
        int  score; // number of scores
        string str;

}; 
#endif // RESULT_H

Все это работает именно так, как я хочу, но мне нужно это изменить, поэтому вместо того, чтобы читать по словам, я хочу использовать istream и getline с разделителем. Большинство комментариев в коде — это моя попытка перейти на метод getline. Я сделал массив строк и в качестве теста попытался поместить в него первый элемент в прочитанном файле, но, очевидно, это не сработало.

Я просто ищу небольшое руководство здесь. заранее спасибо

РЕДАКТИРОВАТЬ :: Входной файл: rinput.txt

31525 1 4
JPN_101 3 Japanese, 90,
ICT 4 example1, 91,
TIC 4 example2, 92,
CIT 4 example3, 93

Итак, там, где написано example1 и 91, это два элемента, для которых я пытаюсь использовать getline с разделителем, потому что я хочу использовать пробелы в моем файле чтения.

Другая информация читается в разных классах, которые я изменю на метод getline, когда заставлю этот работать.

Выходной файл: routput.txt

Student ID: 31525
Semester:   1
  Unit:  JPN_101
  Credits: 3
  Unit Name:  Japanese
  Result: 90

  Unit:  ICT
  Credits: 4
  Unit Name:  example1
  Result: 91

  Unit:  TIC
  Credits: 4
  Unit Name:  example2
  Result: 92

  Unit:  CIT
  Credits: 4
  Unit Name:  example3
  Result: 93

Number of courses = 4
Total credits     = 15

Это вывод, когда я использую метод оператора с символами массива.

include\Result.h|28|error: expected identifier before ','|

include\Result.h|28|error: expected ',' or '...' before ','|

||=== Build failed: 2 error(s), 0 warning(s) (0 minute(s), 1 second(s)) ===|

который указывает на строку файла заголовка 28, которая является friend istream & getline( istream & input, Result & Re, ',' );

Полагаю, я просто не понимаю, почему простое изменение его на массив строк (string Coursename[CourseNameSiz];), а затем простое изменение метода operator на метод getline не просто возвращает ввод, как для метода оператора.

Надеюсь, я правильно объяснил, мне нужно, чтобы кто-то немного перевел это, чтобы помочь мне лучше выразить это.

Спасибо


person user2224223    schedule 08.04.2015    source источник
comment
Хорошим началом может стать чтение std::getline справочника. И, как и сейчас, вам нужно читать дважды. Кроме того, std::getline читает только строки, вам нужно преобразовать, например, в. целые числа самостоятельно.   -  person Some programmer dude    schedule 08.04.2015
comment
пытался поместить в него первый элемент из прочитанного файла, но, очевидно, это не сработало. - опубликуйте свой вклад и точную информацию о том, как это не сработало - что вы хотели и ожидали, и что произошло, а что вы не понимаете в разнице....   -  person Tony Delroy    schedule 08.04.2015
comment
Хорошо, дай мне секунду, чтобы опубликовать свои мысли   -  person user2224223    schedule 08.04.2015


Ответы (1)


Эта линия

friend istream & getline( istream & input, Result & Re, ',' );

не будет компилироваться, потому что у вас есть константа в качестве третьего параметра вместо объявления параметра.

В вашем случае, поскольку вы жестко кодируете ',' в вызове getline внутри метода, вам вообще не нужно передавать запятую.

friend istream & getline( istream & input, Result & Re);

Точно так же, когда вы определяете функцию, вам не нужен ',' в определении функции:

istream& getline( istream & input, Result & Re)
{
  getline(Re.Coursename, input, ',');
  return input;
}

Обратите внимание, что вам по-прежнему нужна запятая во внутреннем вызове getline.

Это должно исправить перечисленные вами ошибки компилятора, вам все равно придется отлаживать код, если он не работает.

person The Dark    schedule 08.04.2015
comment
Ура, теперь это дает мне разные ошибки, что в программировании означает прогресс. Я получаю сообщение об ошибке в другом классе, потому что я вызываю этот объект класса с помощью istream & operator >>( istream & input, Registration & R ), который имеет цикл for(unsigned i = 0; i < R.count; i++) input >> R.Units[i] >> R.Results[i];, поэтому мне нужно изменить все это на метод getline, что хорошо. Спасибо :) - person user2224223; 08.04.2015