首页 > 解决方案 > C++:从单个 std::stringstream 转换多个命令行参数

问题描述

我有一个程序,它从命令行输入多个字符串和数字变量。由于我想将少量输入转换为数字类型,因此我一直按照learncppstd::stringstream的建议使用。目前,我的代码看起来像:

主文件

int main(int argc, char* argv[]) {
if (argc != 7)
{
     std::cout << "Execute the program in the following format:\n";
     std::cout << ".\segment inputImage outputDir color k sigma minSize\n";
     std::cout << "Exiting program\n";
     std::exit(1);
}

float gaussianBlur, kValue;
int minimumComponentSize;
std::filesystem::path path = std::filesystem::u8path(argv[1]);
std::string outputFolder = argv[2];
std::string color = argv[3];

std::stringstream convert{argv[4]};
if (!(convert >> gaussianBlur))
{
     gaussianBlur = 1.5; // default value
}

std::stringstream convertK{argv[5]};
if (!(convertK >> kValue))
{
     kValue = 900; // default value
}

std::stringstream convertMin{argv[6]};
if (!(convertMin >> minimumComponentSize))
{
     minimumComponentSize = 900;
}
 ....

如您所见,我正在stringstream为要转换为数字类型的每个参数创建一个变量。我无法为stringstream变量重新分配另一个值。有没有办法从一个单一的转换所有参数stringstream?有一个更好的方法吗?

标签: c++c++17command-line-argumentsstringstream

解决方案


您可以将所需的argv值写入单个stringstream(以空格分隔),然后将每个值读入相应的变量中:

//...
std::stringstream convert;
convert << argv[4] << " " << argv[5] << " " argv[6]; // Add more "argv" strings
convert >> gaussianBlur >> kValue >> minimumComponentSize; // Read more values
//...

但是,当然,错误条件检查起来有点棘手。如果你需要这个,你可以一次从那个(单个)读取项目stringstream,就像你已经做的那样:

if (!(convert >> gaussianBlur))
{
    gaussianBlur = 1.5; // default value
}
if (!(convert >> kValue))
{
    kValue = 900; // default value
}
if (!(convert >> minimumComponentSize))
{
    minimumComponentSize = 900;
}

推荐阅读