C ++: использование getline для ввода из текстового файла либо пропускает первую строку, либо портит остальные - PullRequest
1 голос
/ 08 мая 2019

Я пытаюсь читать из специально отформатированного текстового файла для поиска определенных имен, номеров и т. Д. В этом случае я хочу прочитать первое число, затем получить имя и перейти к следующей строке.Моя проблема, кажется, с условием цикла while для чтения файла построчно.Вот пример формата файла txt:

5-Jon-4-Vegetable Pot Pie-398-22-31-Tue May 07 15:30:22 
8-Robb-9-Pesto Pasta Salad-143-27-22-Tue May 07 15:30:28 
1-Ned-4-Vegetable Pot Pie-398-22-31-Tue May 07 15:30:33 

Я покажу вам два решения, которые я пробовал: одно, которое пропускает первую строку в файле, а другое, которое не принимает самоПоследняя линия.Я попробовал типичное время (! IFile.eof ()) в качестве последней попытки, но ничего не получил.

    transactionLog.clear();
    transactionLog.seekg(0, std::ios::beg);


    std::string currentName, line, tempString1, tempString2;
    int restNum, mealNum;
    bool nameFound = false;
    int mealCount[NUMMEALS];

    std::ifstream in("patronlog.txt");

    while(getline(in, line)) 
    {
        getline(in, tempString1, '-');
        getline(in, currentName, '-');

        if(currentName == targetName)
        {
            if(getline(in, tempString2, '-'))
            {
                mealNum = std::stoi(tempString2);
                mealCount[mealNum - 1] += 1;
                nameFound = true;
            }
        }

Мне кажется, я понимаю, что происходит в этом.«Getline (in, line)» полностью занимает первую строку, и, поскольку я не использую его, он по сути пропускается.По крайней мере, он берет первое число, затем имя и затем выполняет операции правильно.Ниже приведена модификация кода, который, как я думал, исправит это.

    while(getline(in, tempString1, '-'))
    {
        getline(in, currentName, '-');

        // same code past here
    }

Я рассчитывал изменить условие цикла while на фактический getline первого элемента в текстовом файле, но теперь, когда япосмотрите на это через отладчик, во втором цикле он устанавливает tempString1 в "Vegetable Pot Pie", а не в следующее имя в следующей строке.По иронии судьбы, эта строка отлично подходит для строки № 1, но не для остальной части списка.В целом я чувствую, что это сделало меня дальше от моего предполагаемого поведения, чем раньше.

1 Ответ

1 голос
/ 08 мая 2019

Вам нужно разобрать содержимое строк после того, как они прочитаны.Вы можете использовать std::istringstream, чтобы помочь вам в этом.

while(getline(in, line)) 
{
    // At this point, the varible line contains the entire line.
    // Use a std::istringstream to parse its contents.

    std::istringstream istr(line);

    getline(istr, tempString1, '-');  // Use istr, not in.
    getline(istr, currentName, '-');  //    ditto 

    ...
}
...