Это вопрос, который я копировал из другого вопроса, который был приостановлен. Мне интересно, почему дополнительный дефис добавляется в начало потока выходного буфера, когда я объединяю более одной строки в 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
Но я все еще не знаю, ПОЧЕМУ это так. Почему возврат каретки, сопровождаемый завершением строки, вызывает такое поведение?
Дети в эти дни. Даже не знаю, что такое телетайп. Возврат каретки перемещает выходное положение в начало текущей строки. И только для полноты, linefeed перемещает выходную позицию вниз на одну строку. Комбинация перемещает выходную позицию в начало следующей строки. Вот почему файлы Windows используют CR + LF, чтобы отметить начало новой строки. –
Но то же самое происходит, когда у меня есть «^ M $». Теперь работа над воспроизводимым примером – Paul
'' \ n'' является «символом новой строки» в семействе языков C. Когда буквальный текст, содержащий '' \ n'', записывается в выходной поток, он сообщает службе поддержки время, необходимое для начала новой строки. Это контракт между поддержкой выполнения и компилятором; независимо от того, какое значение они согласны, представлено в тексте программы как «\ n». Это часто одно и то же ** значение ** как представление ASCII для новой строки, но это не код ASCII. –