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

Reading In Formatted Data with Multiple Delimiters C++

我正在尝试从带有多个分隔符的命令提示符中读取数据,例如:

数据 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 之后,但如果不输入定界符,它永远不会运行。执行此操作的最佳方法是什么,检查错误并查看数据是否未以所需格式输入?

你必须自己解析输入。

首先,您的输入不包含 "data with multiple delimiters"。根据您的描述,您的输入包含一行文本,是在某种命令提示符下输入的。

如果是,则应使用单个 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 的相同整个过程,以及以下输入项,这使用句号的时间。

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

您可以将整行读入 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失败,说明数据有错误。