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

标签 c++ c++17 command-line-arguments stringstream

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

ma​​in.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 变量重新分配另一个值。有没有办法从单个字符串流转换所有参数?有更好的方法吗?

最佳答案

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

关于C++:从单个 std::stringstream 转换多个命令行参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62385847/

相关文章:

c++ - 有没有办法检测 QTreeWidgetItem 中的所有子项何时都被标记为 'hidden' ?

c++ - 调用 *shared_ptr* 的方法 - 引用计数会发生什么变化?

c++ - 管理琐碎类型

c++ - 在 C++17 中使用空列表初始化构造函数时出现编译错误

c - Boost.Program_options 的良好 C 替代方案?

c++ - 使用解引用对象调用虚函数

C++实例化

r - 我可以使用 optparse 指定强制参数吗

c++ - 传递\in C++ 的命令行参数

c++ - wince数据错位