繁体   English   中英

使用多个分隔符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, '.');

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

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

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

你必须自己解析输入。

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

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

std::string str;

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

现在,你已经阅读了你对str的输入。 现在这个任务已经完成,你可以开始使用相应的分隔符验证str是否包含正确格式化的输入。

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

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

find()的完整文档find()将在C ++书中找到它的描述find()将解释如何确定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失败,则表示数据中存在错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM