使用多个分隔符C ++读取格式化数据

时间:2017-02-12 04:48:27

标签: c++ getline

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

数据1,数据2,数据3。

我喜欢在第一个逗号之前读取数据的代码,之后和第二个逗号之前的数据,以及之后但在句点之前的数据。我一直在用这个:

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

如果输入的信息正确,它就可以实现我的目的。但是,我该如何检查并查看信息是否不合适?因为如果用户没有输入两个逗号和一个句点,那么程序会因为我没有找到getline()读取中指定的分隔符而假定cin流被破坏而陷入困境。我试过这个:

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

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

2 个答案:

答案 0 :(得分:2)

您必须自己解析输入。

对于初学者,您的输入不包含“具有多个分隔符的数据”。您的输入包含一行文本,根据您的描述,在某种命令提示符下输入。

如果是这样,那么应该使用单个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()是否实际找到了逗号。根据您的程序可以采取适当的操作(如果未找到逗号)或使用substr()方法,在此str上,在逗号之前提取字符串的一部分。那将是你的第一个VAR。然后,再次使用substr()在第一个逗号后提取输入文本的其余部分。

您还可以在C ++手册中找到substr()的完整说明。

使用substr()提取剩余的输入文本后,在第一个逗号后,您只需重复相同的整个过程来提取data2和以下输入项,这次使用一段时间。

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

答案 1 :(得分:0)

您可以将整行读入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失败,则表示数据中存在错误。