我正在编写一个简单的函数,用于我的实用程序实现文件之一。我最近发现,在使用 C++17 库之一时,在调用
std::filesystem::path::string()
时使用 printf()
函数输出目录条目只会导致一串奇怪的字符被发送到 STDOUT
。使用 cout
不会产生任何问题。这是代码:
if( !initialized )
{
try
{
const filesystem::path MODELS_DIRECTORY = R"(C:\-----\-----\-----\models)";
const filesystem::path RESOURCES_DIRECTORY = filesystem::relative(R"(\Resources)", MODELS_DIRECTORY);
for( const filesystem::directory_entry& dir_entry : filesystem::directory_iterator{ MODELS_DIRECTORY } )
{
string test = "this\\is\\a test\\";
string directory = dir_entry.path().string();
printf("%s\n", test);
//cout << directory << endl;
}
}
catch( filesystem::filesystem_error& fs_err )
{
printf( "fs exception caught in GraphicsDataCatalog::InitCatalog()" );
}
initialized = true;
}
使用由
std::string test
组成的测试机制和对 printf()
的调用表明双反斜杠是罪魁祸首。删除字符串中的空格并不能解决问题——我假设可能有一个格式说明符来解决打印到控制台的不稳定字符。将 cout
与 string
调用返回的 dir_entry.path().string()
一起使用会成功。
有人对此主题有更多了解吗?
MRE(最小可重复示例):
#include <iostream>
using namespace std;
int main()
{
const string PASS_STRING = "This is a test.";
const string FAIL_STRING = "This\\is not\\a\\test.";
cout << PASS_STRING << endl;
cout << "Test passed.\n" << endl;
printf( "%s\n", FAIL_STRING );
printf( "Test failed.\n" );
return 0;
}
%s
格式说明符采用 char *
,而不是 std::string
。您将错误的参数类型传递给 printf
。