Проблемы с чтением первой строки из файла после 'getline'

После ввода getline первая строка чисел в моем входном файле игнорируется, и программа запускается со второй строки до конца.

Вот код:

while (!file.eof())
{
    getline(file, lineBuffer);
    if(lineBuffer.length()==0)
    {
        continue; //ignore empty lines
    }
    else 
    {
      //file.open("test.txt");
        while (file >> A >> B >> N)
        {

            for(int count=1; count<=N; count++)
            {
                if(count%A == 0 && count%B == 0) { cout << "FB "; }

                else if(count%A == 0) { cout << "F "; }

                else if(count%B == 0) { cout << "B "; }

                else { cout << count << " "; }

            }
            cout << endl;
        }
    }
}

Входной файл содержит 3 строки целых чисел, и обрабатываются только вторая строка и третье. Я широко это рассмотрел, но никто не упомянул случай, похожий на мой. Обычно они имеют дело с людьми, пытающимися получить пользовательский ввод после функции getline . Любые идеи очень приветствуются.

1
Вы можете показать образец входного файла?
добавлено автор Some programmer dude, источник
Кстати, не используйте while (! File.eof ()) . Вместо этого сделайте так, как в другом цикле: while (std :: getline (...))
добавлено автор Some programmer dude, источник
Кстати, не используйте while (! File.eof ()) . Вместо этого сделайте так, как в другом цикле: while (std :: getline (...))
добавлено автор Some programmer dude, источник
Кстати, не используйте while (! File.eof ()) . Вместо этого сделайте так, как в другом цикле: while (std :: getline (...))
добавлено автор Some programmer dude, источник
В этом вопросе есть тысячи вопросов :-( Вы должны попытаться получить некоторые данные перед тестированием для eof() . Когда вы используете getline , проверьте результат, чтобы увидеть если это удалось. Ваша попытка игнорировать пустые строки также выбрасывает содержимое lineBuffer , где вы нашли lineBuffer.length ()! = 0 ..., который содержит первый набор A, B, N, которые вам не хватает. Вы можете просто оставить все вне цикла while (file >> A ...) , и оно начнет работать, как вы, вероятно, хотите (у вас есть " я сказал, что вы ожидаете, но я предполагаю, что это обработать этот первый ряд).
добавлено автор Tony Delroy, источник
В этом вопросе есть тысячи вопросов :-( Вы должны попытаться получить некоторые данные перед тестированием для eof() . Когда вы используете getline , проверьте результат, чтобы увидеть если это удалось. Ваша попытка игнорировать пустые строки также выбрасывает содержимое lineBuffer , где вы нашли lineBuffer.length ()! = 0 ..., который содержит первый набор A, B, N, которые вам не хватает. Вы можете просто оставить все вне цикла while (file >> A ...) , и оно начнет работать, как вы, вероятно, хотите (у вас есть " я сказал, что вы ожидаете, но я предполагаю, что это обработать этот первый ряд).
добавлено автор Tony Delroy, источник
Вы отметили данные linebuffer ? и что находится в test.txt ?
добавлено автор user2166576, источник

3 ответы

getline(file, lineBuffer) reads a line from file and stores it in lineBuffer. If you want to use it, you should then process lineBuffer instead of reading from file (where the first line will already be skipped). To make it work, simply remove all code outside of the inner while. This will read from the file 3 numbers at a time, stopping when extracting one of them fails.

1
добавлено
@StephenPaul Если вы используете этот шаблон кода, вы затем обрабатываете lineBuffer вместо того, чтобы читать больше чисел из file .
добавлено автор Angew, источник
Во-первых, я забыл упомянуть, что это проблема кодирования CodeEval, которую я пытаюсь сделать. У меня создалось впечатление, что этот код тестового кода был неизбежным и должен был быть там, но я считаю, что это только необязательно ... Вот формулировка из окна ввода кода на странице отправки:/* Пример кода для чтения в тесте case: ifstream file; file.open (argv [1]) while (! file.eof ()) {getline (файл, lineBuffer); if (lineBuffer.length() == 0) continue;//игнорируем все пустые строки else {// делаем что-то здесь}} * /
добавлено автор Stephen Paul, источник

Является ли приведенный выше код реальным или это пример?

If it is real, you don't need to skip th eempty lines. The operator>> will skip the whitespaces for you.

Следующий код без переадресации строк выполняет одно и то же чтение строк «A B N»:

// outer loop is not needed, either remove it, or include error checking
// while (!file.eof() && !file.fail())
{
    while (file >> A >> B >> N)
    {
        for(int count=1; count<=N; count++)
        {

            if(count%A == 0 && count%B == 0) { cout << "FB "; }
....

Если по какой-то причине вы не можете удалить getline вообще, помните, что getline читает строку ALWAYS (ну, если стрепагоинтер не дошел до конца). Это означает, что ваш код пропускает пустые строки, затем читает первую непустую строку, замечает, что строка не пуста и прерывает цикл. Обратите внимание, что прочитал строку , поэтому ваша первая строка данных теперь находится в linebuffer , а не в потоке. Теперь вам нужно либо отключить всю строку (если ваш поток поддерживает ее), либо перемотать поток по длине строки (если ваш поток поддерживает его) или - просто прочитайте данные из строки , например, используя класс istringstream .

In general, mixing getline and operator>> is doable but tricky, (especially when you first read via >> and then want to skip a 1 or 2 lines), as they behave a little differently in terms of buffering and whitespace-handling. If you really want that, search for this subject - there are lots of examples how to sync them.

0
добавлено
Я бы сбросил while (! File.eof ()) . В первый раз, когда вы вводите его, всегда верно. Во второй раз, если чтение не выполнено для чего-то другого, кроме конца файла, у вас есть бесконечный цикл.
добавлено автор Bo Persson, источник
Подсказка к OP: чтобы их смешивать, вы обычно продолжаете читать строки в строке с использованием getline, а затем используйте эту строку для инициализации istringstream , из которой вы анализируете свои значения в строке.
добавлено автор Tony Delroy, источник
ah, right, errorflags .. Я обновлю код
добавлено автор quetzalcoatl, источник

Является ли приведенный выше код реальным или это пример?

If it is real, you don't need to skip th eempty lines. The operator>> will skip the whitespaces for you.

Следующий код без переадресации строк выполняет одно и то же чтение строк «A B N»:

// outer loop is not needed, either remove it, or include error checking
// while (!file.eof() && !file.fail())
{
    while (file >> A >> B >> N)
    {
        for(int count=1; count<=N; count++)
        {

            if(count%A == 0 && count%B == 0) { cout << "FB "; }
....

Если по какой-то причине вы не можете удалить getline вообще, помните, что getline читает строку ALWAYS (ну, если стрепагоинтер не дошел до конца). Это означает, что ваш код пропускает пустые строки, затем читает первую непустую строку, замечает, что строка не пуста и прерывает цикл. Обратите внимание, что прочитал строку , поэтому ваша первая строка данных теперь находится в linebuffer , а не в потоке. Теперь вам нужно либо отключить всю строку (если ваш поток поддерживает ее), либо перемотать поток по длине строки (если ваш поток поддерживает его) или - просто прочитайте данные из строки , например, используя класс istringstream .

In general, mixing getline and operator>> is doable but tricky, (especially when you first read via >> and then want to skip a 1 or 2 lines), as they behave a little differently in terms of buffering and whitespace-handling. If you really want that, search for this subject - there are lots of examples how to sync them.

0
добавлено
Я бы сбросил while (! File.eof ()) . В первый раз, когда вы вводите его, всегда верно. Во второй раз, если чтение не выполнено для чего-то другого, кроме конца файла, у вас есть бесконечный цикл.
добавлено автор Bo Persson, источник
Подсказка к OP: чтобы их смешивать, вы обычно продолжаете читать строки в строке с использованием getline, а затем используйте эту строку для инициализации istringstream , из которой вы анализируете свои значения в строке.
добавлено автор Tony Delroy, источник
ah, right, errorflags .. Я обновлю код
добавлено автор quetzalcoatl, источник
pro.cxx
pro.cxx
3 049 участник(ов)

C/C++ chat 0. Простые вопросы, лабы и о IDE — в чат новичков @supapro 1. Не хамим, не переходим на личности, не вбрасываем утверждения без доказательств 2. No Ads, offtop, flood Объявления о вакансиях и евенты - в лс @AlexFails https://t.me/ProCxx/259155

supapro.cxx
supapro.cxx
1 925 участник(ов)

Чат для тех, кто немного знает C++, простые вопросы по реализации, синтаксису и ide – сюда, а для другого есть: /Главный чат по серьезным вопросам — @ProCxx /Чат по обсуждению всего — @fludpac

C++ Russia
C++ Russia
384 участник(ов)

Сообщество разработчиков C++ в Telegram.

cxx.Дискуссионная
cxx.Дискуссионная
298 участник(ов)

это не двач, общайтесь вежливо; разговор на почти любые темы; Не согласны с баном? В лс @AlexFails, @ivario

C++ для маленьких и тупых
C++ для маленьких и тупых
105 участник(ов)

Лоу левел (по среднему IQ участников) чатик ExtremeCode @extremecode Флудилка @extremecode_rest