2015-04-17 6 views
0

Так что я пытаюсь читать из текстового файла и печатать каждую строку, окруженную двумя строками. Например, это моя программа:Выход не печатается в правильном порядке

string command; 

int main() 
{ 
    while (!cin.eof()) { 
     while (getline(cin, command)) { 
      cout << "Can't add element : " << command << " : invalid parameter." << endl; 
     } 
    } 
} 

Входной файл в виде 3-х чисел каждой строки, например:

1 1 1 
2 2 2 
5 4 9 

Таким образом, вывод должен быть:

Can't add element : 1 1 1 : invalid parameter. 
Can't add element : 2 2 2 : invalid parameter. 
Can't add element : 5 4 9 : invalid parameter. 

Вместо этого он печатает как:

: invalid parameter.1 1 1 
: invalid parameter.1 2 2 
: invalid parameter.5 4 9 

Для жизни я не могу понять, почему это происходит. Любая помощь?

+3

Похоже, вы читаете файл с концами строк CRLF в системе с окончанием строки LF. – chris

+7

Не используйте 'while (! Cin.eof())'. Это не всегда так. К счастью, ваш код _also_ имеет правильный цикл, поэтому он может просто удалить неверный 'while'. –

+0

Связанный: [Почему iostream :: eof внутри условия цикла считается неправильным?] (Http://stackoverflow.com/q/5605125) –

ответ

2

Строка command имеет символ возврата каретки (\r) в конце его. Когда это выводится на консоль, это приводит к перезапуску вывода в начале строки. Разделите символ перед его печатью.

+0

Подумайте, почему это происходит, хотя я всегда думал, что 'getline' позаботился о разных конверсии по контенту при чтении файла в текстовом режиме. –

+0

@ Рапаэль, ты прав, это хороший вопрос. Быстрая проверка показывает, что 'cin' должен быть текстовым режимом по умолчанию. –

-1

Попробуйте что-нибудь, как показано ниже (это может помочь вам)

int main() { 
    string line; 
    ifstream myfile ("example.txt"); 
    if (myfile.is_open()) { 
    while (getline (myfile,line)) { 

     cout << "Can't add element : " << line<< " : invalid parameter." << endl; 
    } 
    myfile.close(); 
    } 

    else cout << "Unable to open file"; 

    return 0; 
} 
1

Обратите внимание, что текст ": недопустимый параметр." перезаписывает текст «Невозможно добавить элемент:» точно в ваш вывод. Проверьте строку «command» после getline(), я уверен, что вы будете иметь «CR» (ascii 13) в качестве последнего символа, поэтому после выписывания строки «command» дальнейший вывод продолжается в начале строки.

Если бы я должен был предположить, почему это происходит, я бы предположил, что ваш эмулятор терминала отправляет «CRLF», где ваша система ожидает только «LF» в качестве символа конца строки.

Смежные вопросы