символ новой строки c ++ под перенаправлением командной строки Windows - PullRequest
3 голосов
/ 31 июля 2011

Я обнаружил, что перенаправление командной строки Windows автоматически заменит '\ n' на '\ r \ n'.Есть ли способ избежать этой ситуации?Потому что после перенаправления stdout или stderr вы получите '\ r \ r \ n' вместо '\ r \ n', если вы напишите '\ r \ n' в консоль.

Большое спасибо!

Вы можете просто попробовать простую программу:

fprintf(stdout,"Hello, world!\r\n");

, затем запустить ее с перенаправлением:

demo 1>demo.log

Используя любой HEX-редактор, вы обнаружите, что '\r \ n 'представлен как' \ r \ r \ n '.

ОБНОВЛЕНИЕ:

@ steve-jessop Я решил эту проблему с помощью setmode, что приведет к stdout используя O_BINARY режим.Так что поток не будет переводить \n в \r\n.

Большое спасибо!

Ответы [ 2 ]

6 голосов
/ 31 июля 2011

Чтобы избежать этого, не пишите "Hello, world!\r\n". fprintf(stdout,"Hello, world!\n"); или std::cout << "Hello, world!" << std::endl; достаточно.

Это не относится к перенаправлению командной строки или stdout, то же самое будет верно для любого файлового дескриптора, открытого в символьном режиме (в отличие от двоичного режима).

5 голосов
/ 31 июля 2011

'\ n' - независимое от платформы представление новой строки. Он расширяется компилятором до любого фактического представления новой строки для платформы, для которой вы компилируете - '\ r \ n' для Windows и '\ n' для * nix и друзей, включая MacOS.

Так вот почему вы видите «\ r \ r \ n» в шестнадцатеричном редакторе - «\ n» из «\ r \ n», которое вы написали в источнике, было расширено до «\ r \ r \ n».

...