【问题标题】:Reading In Formatted Data with Multiple Delimiters C++读取具有多个分隔符的格式化数据 C++
【发布时间】:2017-06-30 06:33:19
【问题描述】:

我正在尝试使用多个分隔符从命令提示符读取数据,例如:

数据 1、数据2、数据3。

我希望代码读取第一个逗号之前的数据,之后和第二个逗号之前的数据,最后是之后但在句点之前的数据。我一直在用这个:

getline(cin, VAR, ',');
cin.get();
getline(cin, VAR2, ' ');
getline(cin, VAR3, ',');
cin.get();
getline(cin, VAR4, '.');

只要输入正确的信息,它就会做我想做的事。但是,我如何检查信息是否不正确?因为如果用户没有输入两个逗号和一个句点,程序就会卡住,因为我假设 cin 流在没有找到 getline() 读取中指定的分隔符后被破坏。我试过这个:

if (cin.fail()) {
        cout << "failure" << endl;
}

在 getline 之后,但如果不输入分隔符,它将永远不会运行。执行此操作、检查错误并查看数据是否未以所需格式输入的最佳方法是什么?

【问题讨论】:

    标签: c++ getline


    【解决方案1】:

    你必须自己解析输入。

    首先,您的输入不包含“具有多个分隔符的数据”。您的输入由单行文本组成,根据您的描述,该文本是在某种命令提示符下输入的。

    如果是这样,则应使用单个 std::getline() 库函数读取文本行,因为默认情况下,std::getline() 使用 \n 作为默认分隔符。

    std::string str;
    
    std::getline(std::cin, str);
    

    现在,您已将输入读入str。现在此任务已完成,您可以开始验证str 是否包含格式正确且带有适当分隔符的输入。

    为此,您将使用std::string 对象提供的丰富方法集。例如,find() 这样的方法在字符串中搜索特定字符,例如您的第一个逗号:

    auto n=str.find(',');
    

    find() 的完整文档(您可以在 C++ 书中找到其描述)将解释如何确定 find() 是否真的找到了逗号。基于此,您的程序可以采取适当的措施(如果未找到逗号)或在此 str 上使用 substr() 方法来提取逗号之前的字符串部分。那将是你的第一个 VAR。然后,再次使用substr() 提取输入文本的其余部分,在第一个逗号之后。

    您还可以在您的 C++ 书籍中找到对 substr() 的完整描述。

    在使用substr() 提取其余输入文本后,在第一个逗号之后,您将简单地重复提取data2 和以下输入项的相同整体过程,这次使用句点。

    而且,在每个步骤中,您都将获得程序确定输入格式是否正确所需的所有信息。

    【讨论】:

    • 这是一个很好的答案,谢谢。我以为我可以从 cin 中读取所有内容,但这是一个更好的主意
    【解决方案2】:

    您可以将整行读入std::string,然后使用std::istringstream 解析字符串:

    #include <iostream>
    #include <string>
    #include <sstream>
    #include <cstdlib>
    
    int main(void)
    {
        const std::string   input_text = "data1, data2, data3\n";
        std::istringstream  input_stream(input_text);
    
        std::string data1;
        std::string data2;
        std::string data3;
    
        std::getline(input_stream, data1, ',');
        std::getline(input_stream, data2, ',');
        std::getline(input_stream, data3, ',');
    
        std::cout << "data1: " << data1 << '\n';
        std::cout << "data2: " << data2 << '\n';
        std::cout << "data3: " << data3 << '\n';
    
        return EXIT_SUCCESS;
    }
    

    如果std::getline 失败,则表示数据有错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-05
      • 2023-03-30
      • 1970-01-01
      • 2015-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多