Почему не печатается половина моей выписки cout?

Я печатаю оператор из классов, используя функции получения. Верхние 1,5 строки моего оператора cout не печатаются. Я попытался очистить поток, а также скопировал и вставил строки, которые не печатаются за пределами оператора if, и он распечатывает! Я не могу понять, что происходит. Вот функция:

// display all books out on loan
void displayBorrowed(vector<LibraryBook>& book)
{

    cout << "Books currently checked out: " << endl << endl;

    for(unsigned int i = 0; i < book.size(); i++)
    {
        //cout << "ID: " << book[i].getId_() << "  Title: " 
             //<< book[i].getTitle_() << endl << endl;

        if(book[i].getIsLoaned_() == true)
        { 
            std::cout.flush();
            cout << "ID: " << book[i].getId_() << "  Title: "
                 << book[i].getTitle_() << "  Author: " 
                 << book[i].getAuthorFirst_() << " " << book[i].getAuthorLast_()
                 << "  Year Published: " <<  book[i].getYearPubl_() << endl
                 << "Due Date: " << book[i].getDueMonth_() << "/" 
                 << book[i].getDueDay_() << "/" << book[i].getDueYear_()
                 << " Date Borrowed:  " << book[i].getBorrwdMonth_() << "/"
                 << book[i].getBorrwdDay_() << "/" << book[i].getBorrwdYear_()
                 << endl << "Checked out by: " << book[i].getBorrwFirst_()
                 << " " <<  book[i].getBorrwLast_() << endl << endl;
        }
    }
}

Он отображает это:

Books currently checked out:

  Author: Brendan Behan  Year Published: 1958
Due Date: 8/2/2017 Date Borrowed:  7/21/2017
Checked out by: Cassie Peterson

Если строки в операторе if скопированы из оператора if, он отображается нормально:

ID: 78620 Название: Чжуань Фалунь

Я попытался изменить оператор if на false, чтобы отобразить все книги, не предоставленные во временное пользование, и все они отображались одинаково, за исключением самой последней книги (номер 50, наконец, отображал идентификатор # и название. Я в полной растерянности. Что происходит на?

Должно получиться так:

ID: 78620  Title:  Zhuan Falun Author: Brendan Behan  Year Published: 1958
Due Date: 8/2/2017 Date Borrowed:  7/21/2017
Checked out by: Cassie Peterson

(дисплей еще не отформатирован)

Я просто изменил его на это, где у меня есть каждый элемент, который не отображается в собственном операторе cout, и НИКТО не отображает !! Какие??! (до автора, я имею в виду, где он начал отображаться раньше.)

    for(unsigned int i = 0; i < book.size(); i++)
    {
        if(book[i].getIsLoaned_() == true)
        { 
            std::cout.flush();
            cout << "ID: " ;
            cout << book[i].getId_();
            cout << "  Title: ";
            cout <<  book[i].getTitle_();
            cout << "  Author: " 
                 << book[i].getAuthorFirst_() << " " << book[i].getAuthorLast_()
                 << "  Year Published: " <<  book[i].getYearPubl_() << endl
                 << "Due Date: " << book[i].getDueMonth_() << "/" 
                 << book[i].getDueDay_() << "/" << book[i].getDueYear_()
                 << " Date Borrowed:  " << book[i].getBorrwdMonth_() << "/"
                 << book[i].getBorrwdDay_() << "/" << book[i].getBorrwdYear_()
                 << endl << "Checked out by: " << book[i].getBorrwFirst_()
                 << " " <<  book[i].getBorrwLast_() << endl << endl;
        }

It prints when I put an endl at the end of each element:

        if(book[i].getIsLoaned_() == true)
        { 
            std::cout.flush();
            cout << "ID: " << endl;
            cout << book[i].getId_() << endl;
            cout << "  Title: " << endl;
            cout <<  book[i].getTitle_() << endl;
            cout << "  Author: "  << endl;
            cout << book[i].getAuthorFirst_() << " " << book[i].getAuthorLast_() << endl;
            cout << "  Year Published: " <<  book[i].getYearPubl_() << endl;
            cout << "Due Date: " << book[i].getDueMonth_() << "/"  << endl;
            cout << book[i].getDueDay_() << "/" << book[i].getDueYear_() << endl;
            cout << " Date Borrowed:  " << book[i].getBorrwdMonth_() << "/" << endl;
            cout << book[i].getBorrwdDay_() << "/" << book[i].getBorrwdYear_() << endl;
            cout << endl << "Checked out by: " << book[i].getBorrwFirst_() << endl;
            cout << " " <<  book[i].getBorrwLast_() << endl << endl;
        }


Books currently checked out:

ID:
47492
  Title:
 Borstal Boy
  Author:
Brendan Behan
  Year Published: 1958
Due Date: 8/
2/2017
 Date Borrowed:  7/
21/2017

Checked out by: Cassie
 Peterson

person KLG52486    schedule 19.04.2017    source источник
comment
Вы пробовали разделить свой длинный cout на несколько более мелких утверждений?   -  person JGroven    schedule 19.04.2017
comment
Что делает book[i].getId_()? Какое значение возвращает функция? Что делает book[i].getTitle_()? Какое значение возвращает функция? Нам будет очень сложно помочь вам в отладке. Вы должны выполнить некоторую отладку самостоятельно, желательно, пошагово пройдя код построчно в отладчике. Это не то, что мы можем сделать.   -  person Some programmer dude    schedule 19.04.2017
comment
@JGroven Это, скорее всего, не поможет. Каждый ‹* фактически является вызовом функции с именем operator<<, возвращающей тот же поток, который был получен. Так что не имеет значения, если вы сделаете cout << a << b; или cout << a; cout << b;   -  person Aconcagua    schedule 19.04.2017
comment
Недавно аналогичная проблема (в другом вопросе SO) была вызвана перепутанными окончаниями строк и случайными \rs. Проверьте строку заголовка и откуда бы вы ее ни взяли.   -  person T.C.    schedule 19.04.2017
comment
Одна из возможностей состоит в том, что в ваших переменных-членах есть символ возврата каретки. Связанное сообщение: stackoverflow.com/questions/42589903/.   -  person R Sahu    schedule 19.04.2017
comment
Я попробовал разделить его на более мелкие струны. По какой-то причине первые пару строк в операторе cout в операторе if просто не отображаются. Я протестировал все отдельные функции получения. Все они работают.   -  person KLG52486    schedule 19.04.2017
comment
Будет ли \ r чем-то напечатанным явно, или это может быть какой-то код ascii для этого или что-то в этом роде? потому что я набрал каждую строку и знаю, что \ r нигде нет.   -  person KLG52486    schedule 19.04.2017
comment
Изменение порядка частей вашего вывода может помочь вам определить проблемную часть. Вы можете наблюдать, например, всегда ли он пропускает первые несколько операторов или всегда начинается (или заканчивается) после определенного оператора.   -  person wkl    schedule 19.04.2017
comment
@ KLG52486: код символа, декабрь 13, шестнадцатеричный 0x0d, также известный как возврат каретки. Обычно встречается в окончаниях строк в стиле DOS / Windows   -  person Hasturkun    schedule 19.04.2017
comment
Перенаправьте вывод в файл, затем просмотрите этот файл в шестнадцатеричном редакторе, чтобы увидеть, есть ли в выводе возврат каретки.   -  person Michael Burr    schedule 19.04.2017
comment
Хорошо, я пытаюсь понять, как это сделать ... Я мог бы просто опубликовать код, но он очень длинный, поэтому я просто не делал этого в первую очередь.   -  person KLG52486    schedule 19.04.2017
comment
В настоящее время существует ошибка Xcode, которая может иметь значение stackoverflow.com/questions/43158839/   -  person Bo Persson    schedule 19.04.2017
comment
Спасибо, но когда я выводю поток в текстовый файл вместо терминала, он ясно показывает, что есть возврат каретки. Я до сих пор не нашел. Я изменил ввод файла на случай, если он исходил оттуда, и я использовал шестнадцатеричный конвертер, чтобы попытаться найти то, что ищу, но я просто не знаю, как :(   -  person KLG52486    schedule 19.04.2017


Ответы (1)


Мое предложение:

  1. Выведите каждый из членов в отдельной строке.
  2. Выясните, какой член проблемный.
  3. Погрузитесь глубже в содержимое члена, чтобы понять, как он попал туда, и исправить это.

    if(book[i].getIsLoaned_() == true)
    { 
        std::cout.flush();
        std::cout << "ID: " << book[i].getId_() << std::endl
                  << "Title: " << book[i].getTitle_() << std::endl
                  << "Author First: " << book[i].getAuthorFirst_() << std::endl
                  << "Author Last:" << book[i].getAuthorLast_() << std::endl
                  << "Year Published: " <<  book[i].getYearPubl_() << std::endl
                  << "Due Date Month: " << book[i].getDueMonth_() << std::endl
                  << "Due Date Day: " << book[i].getDueDay_() << std::endl
                  << "Due Date Year: " << book[i].getDueYear_() << std::endl
                  << "Borrowed Month: " << book[i].getBorrwdMonth_() << std::endl
                  << "Borrowed Day: " << book[i].getBorrwdDay_() << std::endl
                  << "Borrowed Year: " book[i].getBorrwdYear_() << std::endl
                  << "Checked out by first: " << book[i].getBorrwFirst_() << std::endl
                  << "Checked out by last: " <<  book[i].getBorrwLast_() << std::endl
                  << std::endl;
    }
}
person R Sahu    schedule 19.04.2017
comment
Когда я ставлю конец в конце каждой строки, все печатается. Как вы думаете, это означает, что случайного возврата каретки нет? - person KLG52486; 19.04.2017
comment
@ KLG52486, как раз наоборот. Это означает, что в заголовке есть возврат каретки. - person R Sahu; 19.04.2017
comment
Если я поставлю конец между getTitle и Author: тогда все отобразится. Любые предложения о том, как выяснить, как это вызывает проблему? - person KLG52486; 19.04.2017
comment
О, хорошо, так может ли это быть в заголовке строки? - person KLG52486; 19.04.2017
comment
Ах, я нашел это. Я изменил название книги, и проблема решена. За исключением того, что это только создало новую проблему. Как я могу использовать это название книги? - person KLG52486; 19.04.2017
comment
@ KLG52486, на него будет сложно ответить в комментарии, особенно потому, что вы не показали, как заголовок должен быть в этом состоянии с самого начала. Я советую создать минимальный воспроизводимый пример, который решает только эту проблему. - person R Sahu; 19.04.2017
comment
Я надеялся, что есть способ указать компилятору игнорировать возврат каретки, например, игнорировать апостроф в javascript. Если это будет непростой ответ, я просто выберу другую книгу. Спасибо. - person KLG52486; 19.04.2017
comment
Вы можете заключить вызов book[i].getTitle_() в тот, который обрезает пробелы. - person egrunin; 19.04.2017
comment
Как бы я это сделал? Я до сих пор не понял, как заставить его работать. Я отправил вывод в файл и вижу, что после каждого заголовка есть возврат каретки, а не только один конкретный заголовок, значит, это должно быть в моем коде, верно? Не могу найти :( - person KLG52486; 19.04.2017
comment
@ KLG52486, учитывая std::string s;, вы бы использовали s.erase(std::find(s.begin(), s.end(), '\r'));. - person R Sahu; 19.04.2017