[英]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.