使用多个分隔符 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
失败,说明数据有错误。
我正在尝试从带有多个分隔符的命令提示符中读取数据,例如:
数据 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
失败,说明数据有错误。