C++:从单个 std::stringstream 转换多个命令行参数

C++: Convert multiple command line arguments from a single std::stringstream

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

main.cpp

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 转换所有参数?有更好的方法吗?

您可以将所需的 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;
}

要将不同的值重新分配给同一个 std::stringstream,您需要清除它:

convert.str(std::string());

现在它已清除,您可以使用不同的值重新使用它。

您还必须调用 convert.clear(); 来重置所有先前设置的标志。

将所有参数添加到同一个 std::stringstream .