Разбор текстового файла, одно и то же поле имеет 1 или 2 имени

У меня есть текстовый файл команд НФЛ. У меня проблема при разборе строки, когда речь идет о командах с двумя именами, а не с одним. (т. е. Новая Англия и Питтсбург) следующим элементом в файле является int. Я также должен прочитать эти значения в связанный список.

infile     >> t.date // t is a team struct which contains char name and ints
>> t.name
>> t.W
>> t.L
>> t.T

Могу ли я просто использовать оператор if else между именем и Wins, чтобы проверить, является ли следующий символ символом? И затем, если это символ, он может просто сохранить следующее слово, «Англия», для второй половины имени Новой Англии в том же поле имени, а если это int, то оно перейдет в поле Wins.

текстовый файл ex

Новая Англия 2 4 0
Питтсбург 1 6 0

приведенный выше код был тем, что я пытался использовать, чтобы присвоить имя структуре команды

   struct team
{
public:
team& do_input(std::istream& is);

std::string date, name, name2;
int wins,
losses,
ties;
std::string perc,
home,
road,
div,
conf;
int league;
};
infile >>t.date;

while (infile >> t)
{
t.do_input(infile) ;
//cout << t.date << t.name;
L.push_back(t);
t.name2 = " ";
}

0

Решение

Давайте начнем с поддержки вашего кода. Первое, что я хотел бы сделать, это создать перегрузку operator >> который принимает входной поток и team объект.

std::istream& operator >>(std::istream& is, team& t);

Эта функция должна делегировать операцию извлечения ввода в метод, называемый do_input():

std::istream& operator >>(std::istream& is, team& t)
{
if (is.good())
t.do_input(is);
return is;
}

do_input следует читать объекты типа char в соответствующие строковые объекты в вашем team учебный класс. Говоря о вашем team класс, гораздо лучше использовать std::string для представления строковых значений:

struct team
{
...
std::string date;
std::string name;

int W, L, T;
};

Таким образом, строка может быть настолько большой, насколько нам нужно. Нам больше не нужно беспокоиться о возможном переполнении буфера (то есть при чтении строки размером более 10 байт). Мы также можем использовать удобные методы, которые std::string обеспечивает.

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

int wins, losses, ties;

Теперь мне (и другим) ясно, что означают эти имена.


Так team::do_input является функцией-членом, которая считывает строки и целые числа из файла в элементы данных экземпляра, из которого она вызывается. Вот полная реализация:

struct team
{
public:
team& do_input(std::istream&);
private:
std::string date, name;
int wins, losses, ties;
};

team& team::do_input(std::istream& is)
{
std::getline((is >> date).ignore(), name);
is >> wins >> losses >> ties;

return *this;
}

Отчеты об ошибках были опущены, чтобы пример был кратким. Я надеюсь, что это помогло.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]