2016-12-01 23 views
0

Это вопрос, который я копировал из другого вопроса, который был приостановлен. Мне интересно, почему дополнительный дефис добавляется в начало потока выходного буфера, когда я объединяю более одной строки в cout и почему она переписывает символ там?возврат каретки, вызывающий cout, чтобы перезаписать символы и распечатать не удалось

Ниже приведен минимальный пример, показывающий, как печать любой строки вызывает это. Я опубликовал этот вопрос раньше, но он был приостановлен из-за отсутствия воспроизводимости. Причина, по которой он не был воспроизводимым, заключается в том, что когда я копировал текстовый файл, я не копировал скрытые символы. Оказывается, когда я сделал cat -e ex.txt, все строки заканчивались ^M по какой-то причине. Это и есть причина проблемы. отвечая на него ниже.

-Поль

#include <string> 
#include <fstream> 
#include <iostream> 

using namespace std; 
int main(int argc, char* argv[]){ 
    ifstream infile(argv[1]); 
    string str; 
    getline(infile, str); 
    cout<<"str: "<<str<<"-"<<endl; 
} 

Я скомпилировать и запустить код с:

g++ -o hw4.exe prog4.cpp 

./hw4.exe ex2.txt 

$ cat -e ex2.txt 
Bella Abzug ^M$ 

и ниже выход

od -x ex2.txt 

0000000 6542 6c6c 2061 6241 757a 2067 0a0d 
0000016 

Выход:

-tr: Bella Abzug 

Но я все еще не знаю, ПОЧЕМУ это так. Почему возврат каретки, сопровождаемый завершением строки, вызывает такое поведение?

+3

Дети в эти дни. Даже не знаю, что такое телетайп. Возврат каретки перемещает выходное положение в начало текущей строки. И только для полноты, linefeed перемещает выходную позицию вниз на одну строку. Комбинация перемещает выходную позицию в начало следующей строки. Вот почему файлы Windows используют CR + LF, чтобы отметить начало новой строки. –

+0

Но то же самое происходит, когда у меня есть «^ M $». Теперь работа над воспроизводимым примером – Paul

+0

'' \ n'' является «символом новой строки» в семействе языков C. Когда буквальный текст, содержащий '' \ n'', записывается в выходной поток, он сообщает службе поддержки время, необходимое для начала новой строки. Это контракт между поддержкой выполнения и компилятором; независимо от того, какое значение они согласны, представлено в тексте программы как «\ n». Это часто одно и то же ** значение ** как представление ASCII для новой строки, но это не код ASCII. –

ответ

0

https://en.wikipedia.org/wiki/Control_character

carriage return, т.е. 'перемещает курсор в начало строки'

+0

так почему же он не распознает «$» после возврата каретки в качестве новой строки? – Paul

+0

Поскольку семейство языков C не рассматривает '' $ ''как любой управляющий символ. Это обычный символ, который представляет '' $ ''. Больше ничего. –

+0

, но тогда почему fstream распознает его при вызове newline?Дайте мне знать, если вы хотите еще один пример этого. – Paul