【问题标题】:C++: Convert multiple command line arguments from a single std::stringstreamC++:从单个 std::stringstream 转换多个命令行参数
【发布时间】:2020-10-04 17:23:48
【问题描述】:

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

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 变量。有没有办法从单个stringstream 转换所有参数?有没有更好的方法来做到这一点?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 请不要建议连接argv,撤消在引用和分隔参数时所做的任何仔细工作。在这种微不足道的情况下,它可能无关紧要,但这是一个不好的榜样。
    【解决方案2】:

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

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

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

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

    将所有参数添加到同一个std::stringstream@AdrianMole's answer

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-16
      • 2015-11-30
      • 1970-01-01
      • 2021-07-27
      • 1970-01-01
      • 1970-01-01
      • 2019-07-10
      • 2012-11-05
      相关资源
      最近更新 更多