我正在使用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构建它)
在标准c++中没有办法实现这一点。显然,没有办法通过特定于实现的文档化函数来实现这一点。如果可能的话,它将依赖于实现细节。
你可以钩子CRT函数fopen
,_wfopen
,fopen_s
,wfopen_s
,在钩子函数你会改变打开模式。c++流内部也使用这些函数。
具体怎么做取决于你是静态链接CRT还是动态链接CRT,以及你使用的是哪个版本的Visual Studio。
我希望它能够实现,而不需要对核心c++源代码进行大的更改,比如添加"二进制模式";在任何地方创建输出流的标志。
除了修复你的错误代码没有正确的方法。不应该有很多地方打开文件,所以只需手动修复。你不会一次打开成千上万的文件吧?
也就是说,如果你真的想在c++流中到处使用LF,那么微软STL是开源的。您可以下载STL,对其进行修补并使用该STL,而不是MSVC中的发布版本。C标准库不是开源的,所以你必须手动修复C部分,如果有任何
然而,即使你修补了STL,源代码或输出二进制文件,使其始终使用LF而不是CRLF,那么许多其他功能将失败,例如控制台输出将无法正常工作。这也是非常脆弱的,因为未来添加的新代码或新的3和类库可能会因为不期望LF而崩溃,所以要小心
我已经有了一个比较大的c++项目,可以用GCC,并试图用MSVC构建它
行结束与编译器无关。即使您在Windows上使用GCC构建,它仍然会使用CRLF。它是一个平台属性
你可以通过_setmode来防止这种情况,你可以在程序开始时调用它(注意全局构造函数可能已经打印了一些东西):
#ifdef _WIN32
#include <fcntl.h>
#include <io.h>
#endif
int main() {
#ifdef _WIN32
_setmode(_fileno(stdout), _O_BINARY);
#endif
// ...
}