2015-10-20 10 views
-3
int main(int argc, char *argV[]){ 

istream *br; 
ifstream inFile; 
if(argc == 2){ 

    inFile.open(argV[1]); 

    if(inFile.is_open()){ 
     cout << "file opened."; //if only "file opened" has an "\n then only it will print 
     br = &inFile;  //and the program will freeze right after printing it 
    } 
} 
else if(argc <= 1){ 

    br = &cin; 

} 
else{ 

    cout << "Unrecognized commands"; 

} 
cout << "test"; //having \n here allows the program to reach this line of code and 
cout << "test2\n"; //everything before it 

Происходит нечто странное. Если «\ n» не включено в строку, ничего не будет печататься до стандартного. Например. соиЬ < < «тест» & «test2 \ п» на дно позволяет программе достичь этих строк кода и COUT все, вплоть до этого момента, например, строка «файл открыта», потому что test2 имеет \ n, а файл открывается перед ним. Если они меняются только на cout test1 test2, программа ничего не выводит, в том числе «файл открыт». Кроме того, если я изменил «файл открыт» на «файл открыт \ n», это будет напечатано, но если test1 и test2 не имеют \ n, они не будут печататься, так как они находятся после \ n в «открывшемся файле».Почему моя программа останавливается, если включен « n»

+3

пытались ли вы промывкой потока? – Default

+1

Что такое 'istream * br;' for? 1. Вам не нужен указатель для этого, и 2. вы оставите его неинициализированным! – crashmstr

+0

Вы используете систему unixish? Если да, то './yourprogram; эхо' какая разница? Включает ли приглашение вашей оболочки возврат каретки и перезаписывает ваш вывод? – melpomene

ответ

1

Потоки имеют буферизацию, чтобы избежать необходимости делать большое количество операций ввода-вывода. , cout буферизируется по строке, поэтому конец строки очищает буфер. Вы можете также явно очистить буфер, и все буферы будут очищены (то есть их содержимое отправлено в их адресаты) при нормальном завершении. Если наша программа вылетает или завершается ненормально, буфера не будут сброшены.

+0

Завершение программы также сбрасывает буфер. – melpomene

0

Я подозреваю, что ваши доказательства, что программа остановка/замораживание ограничивается тем, что она не дает ожидаемого результата. Вы можете атаковать эту проблему с помощью source level debugger, чтобы лучше понять, что делает программа, когда она ничего не печатает.

Adding, "print statements" также может быть полезным средством отладки, но вы должны сделать это правильно (что обычно требует, чтобы вы включили \n). Лично я предпочитаю использовать std::cerr для отладки, одна из причин заключается в том, что он автоматически сбрасывает каждый вывод независимо от того, включаете ли вы \n. Вот пример использования сегг:

using std::cerr; 
cerr<<"Unrecognized commands\n"; 

Фундаментально, хотя, почему вы хотите, чтобы cout эти строки без завершающего \n? \n - символ newline. Без него все ваши выходы будут работать вместе на одной и той же линии - даже без промежуточных пробельных символов:

file opened.testtest2 

Если вы хотите погрузиться глубже, вот некоторые из них связаны чтение на буферизацию стандартный вывод (в частности, в " C», хотя): Is stdout line buffered, unbuffered or indeterminate by default?