2013-11-13 2 views
0

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

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, чтобы проверить, является ли следующий символ char? И тогда, если это символ, он может просто сохранить следующее слово «Англия» для второй половины имени Новой Англии в одном и том же поле имени, и если его int будет перемещаться в поле «Победы».

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

New England 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 = " "; 
} 
+2

Опубликуйте некоторый код и формат, в котором данные хранятся в текстовом файле. –

+0

Затем я использую L.push_back (t) для добавления в список – user2989625

+0

Файл шаблона, пожалуйста. – MahanGM

ответ

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

Я получаю то, что вы пытаетесь сделать.Когда вы использовали «данные», я использую дату, как в дате в файле. он имеет одну дату, а затем 32 команды с вышеупомянутым форматом. Означает ли это, что я не должен использовать этот цикл while, который я пытался раньше ... Когда он вернет эти вары, а именно имя, выигрыши, потери, связи, он создаст командный объект для каждой команды? Я все еще потерян. – user2989625

+0

Извините, я сделал опечатку с именем; он должен * быть «дата». Более того, при реализации вы будете делать что-то вроде 'team t; while (infile >> t) ...; ', а не как ваш исходный цикл. У меня есть вопрос: должно ли «дата» быть именем команды? Или «имя» - как первое, так и последнее имя команды? – 0x499602D2

+0

имя будет содержать как имя, так и фамилию команды. Или, только один, если это не двухзначное имя, например, Питсбург или Каролина, против Новой Англии или Нью-Йорк Джетс – user2989625