Программа на C , которая содержит cerr и clog, работает по-разному в Clion и в terminal

#c #iostream #clion

#c #iostream #clion

Вопрос:

Я пытаюсь использовать cerr и clog вместо cout того, чтобы выдавать сообщение об ошибке. Но я столкнулся с проблемой. Ниже приведена упрощенная версия.

 #include <iostream>
using namespace std;

int main() {
    for (int i = 0; i < 5;   i) {
        int x;
        cin >> x;
        cout << "first" << endl;
        cerr << "second" << endl;
    }
    return 0;
}
 

Но результат был

 1
first
second
2
second
first
3
second
first
4
first
second
5
second
first
 

Однако, если я использую g в cmd Win10 для компиляции и запуска, все было в порядке.

 1
first
second
2
first
second
3
first
second
4
first
second
5
first
second
 

Поэтому я начинаю сомневаться, что существуют некоторые определенные настройки, которые делают внутреннюю среду компиляции и запуска Clion отличной от g . Но я не уверен.
Кто-нибудь может сказать мне, почему?

Комментарии:

1. Это неудачный результат буферизации, выполняемой внутри «консоли» CLion, и буферизации стандартных потоков (или, скорее, отсутствия буферизации для std::cerr ).

2. Извините, я новичок, не могли бы вы описать подробно? И не могли бы вы дать несколько инструкций о том, как исправить проблему с помощью Clion, если это возможно? Спасибо.

Ответ №1:

Под капотом много чего есть (SPD упомянул некоторые в комментарии, но не все — посередине есть пти-труба). Но это просто работает:

 #include <iostream>
using namespace std;

int main() {
    for (int i = 0; i < 5;   i) {
        int x;
        cin >> x;
        cout.flush();
        cerr.flush();
        cout << "first" << endl;
        cout.flush();
        cerr << "second"<< endl;
        cerr.flush();
    }
    return 0;
}
 

Подробнее читайте здесь.

Комментарии:

1. Это все еще не работает на Клионе. Проблема не в кодах. Мои исходные коды хорошо работают на терминале, но не на Clion. Ответ SPD навел меня на мысль, что это, вероятно, связано с тем, что консоль в Clion имеет несколько другие настройки, хотя я все еще не очень понимаю.