У меня есть текстовый файл команд НФЛ. У меня проблема при разборе строки, когда речь идет о командах с двумя именами, а не с одним. (т. е. Новая Англия и Питтсбург) следующим элементом в файле является 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 = " ";
}
Давайте начнем с поддержки вашего кода. Первое, что я хотел бы сделать, это создать перегрузку 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;
}
Отчеты об ошибках были опущены, чтобы пример был кратким. Я надеюсь, что это помогло.
Других решений пока нет …