Опция компилятора MSVC C для предотвращения замены LF на CR LF в ostream/ofstream

#c #visual-c #line-breaks #line-endings

Вопрос:

Я использую средства командной строки Microsoft Visual Studio 2017, такие как cl.exe для компиляции кодов C .

Инструкции для вывода разрывов строк, таких как

 std::cout << "abc" << std::endl;
 

или

 std::cout << "abc" << 'n';
 

или

 printf("abcn");
 

в результате "abcrn" вместо "abcn" .
Как я могу изменить это поведение, чтобы получить "abcn" вывод?

Если возможно, я хочу, чтобы это было реализовано без внесения больших изменений в основной исходный код C , например, добавления флага «двоичный режим» везде, где создается выходной поток. (У меня уже есть относительно большой проект на C , который отлично подходит для GCC, и я пытаюсь построить его с помощью MSVC)

Ответ №1:

Этого невозможно достичь с помощью стандартного C . Очевидно, что этого невозможно достичь с помощью конкретных документированных функций реализации. Если это возможно, он будет опираться на детали реализации.


Вы можете подключить функции CRT fopen , _wfopen , fopen_s , wfopen_s , в подключенной функции вы изменили бы режим открытия. Потоки C также внутренне используют эти функции.

Как именно это сделать, будет зависеть от того, связываете ли вы CRT статически или динамически и какую версию Visual Studio вы используете.

Комментарии:

1. «Потоки C также внутренне используют эти функции» — возможно, но это деталь реализации, а не требование.

2. @PeteBecker, конечно. Задокументированного способа достижения поставленной цели нет, поэтому приходится использовать детали реализации.

Ответ №2:

Я хочу, чтобы это было реализовано без внесения больших изменений в основной исходный код C , например, добавления флага «двоичный режим» везде, где создается выходной поток.

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

Тем не менее, если вы действительно хотите использовать LF везде в потоках C , то Microsoft STL с открытым исходным кодом. Вы можете загрузить STL, исправить его и использовать его вместо поставляемой версии в MSVC. Стандартные библиотеки C не имеют открытого исходного кода, поэтому вам придется исправить часть C вручную, если таковая имеется

Однако даже если вы исправите STL, исходный код или выходной двоичный файл, чтобы он всегда использовал LF вместо CRLF, тогда многие другие функции не будут работать, например, вывод консоли не будет работать должным образом. Это также очень хрупко, потому что новый код или новые сторонние библиотеки, добавленные в будущем, могут сломаться, потому что они не ожидают LF, поэтому остерегайтесь этого

У меня уже есть относительно большой проект на C , который отлично подходит для GCC, и я пытаюсь построить его с помощью MSVC

Окончание строки не имеет никакого отношения к компилятору. Даже если вы создадите GCC в Windows, он все равно будет использовать CRLF. Это свойство платформы