从 .txt 文件中读取多种数据类型,其中一个字符串有空格 C++
Reading In Multiple Data types from a .txt file where one of the strings has spaces C++
我有一个如下所示的文本文件:
汽车,CN,819481,维修,false,NONE
汽车,SLSF,46871,商务,真实,孟菲斯
汽车,AOK,156,招标,真实,旧金山
(逗号实际上是制表符,但我无法在本网站上正确设置它们的格式)
我有一个名为 Car 的对象,我正在将代码读入该对象并使用代码底部的输出进行输出。我当前的代码可以读取所有前 5 种数据类型,但我无法读取可能有空格的最后一列。我试过使用 getline,但无济于事。
这是我为将 txt 作为输入的函数编写的代码
void input()
{
ifstream inputFile;
inputFile.open("input.txt",fstream::in);
if (inputFile.fail())
{
cout<<"input failed"<<endl;
exit(1);
}
string type;
string reportingMark;
int carNumber;
string kind;
bool loaded;
string destination;
while(inputFile.peek() != EOF)
{
inputFile>>type>>reportingMark>>carNumber>>kind>>loaded;
while(inputFile.peek() == ' ')
inputFile.get();
getline(inputFile, destination);
Car temp(reportingMark, carNumber, kind, loaded, destination);
temp.output();
}
inputFile.close();
}
不要使用 >>
运算符,使用 getline
:
string line;
while (getline(inputFile, line) {
// split line by tabs or commas
}
拆分函数示例:
vector<string> explode(string &str, char separator) {
vector<string> result;
string tmp;
for (int i = 0; i < str.size(); i++) {
if (str[i] == separator) {
result.push_back(tmp);
tmp.clear();
} else tmp += str[i];
}
if (tmp.size() > 0)
result.push_back(tmp);
return result;
}
希望 std::vector
对您来说不难。示例加载代码(而不是 while(inputFile.peek() != EOF) { ... }
):
string line;
while (getline(inputFile, line) {
vector<string> data = split(line, '\t'); // Or use ASCII code 9
if (data.size() != 5) {
cout << "Invalid line!" << endl;
continue;
}
Car temp(data[0], data[1], stoi(data[2]), data[3], data[4]);
temp.output();
}
不要复制粘贴此代码,我看到您有未处理的 bool 变量等。
STL 函数 std::getline
接受分隔符作为第三个参数,这意味着您可以传递 \t
来读取制表符分隔值。对于最后一个值,只需读取它而不指定分隔符,这意味着将在分隔符为 \n
的地方调用函数的重载版本。
一次读取一行,分成标记,转换为所需的数据类型。
Here 是一个工作示例。虽然可以改进。此外,您还应该处理 std::stoi
在 std::string
到 int
转换期间抛出的异常。
我有一个如下所示的文本文件:
汽车,CN,819481,维修,false,NONE
汽车,SLSF,46871,商务,真实,孟菲斯
汽车,AOK,156,招标,真实,旧金山
(逗号实际上是制表符,但我无法在本网站上正确设置它们的格式)
我有一个名为 Car 的对象,我正在将代码读入该对象并使用代码底部的输出进行输出。我当前的代码可以读取所有前 5 种数据类型,但我无法读取可能有空格的最后一列。我试过使用 getline,但无济于事。
这是我为将 txt 作为输入的函数编写的代码
void input()
{
ifstream inputFile;
inputFile.open("input.txt",fstream::in);
if (inputFile.fail())
{
cout<<"input failed"<<endl;
exit(1);
}
string type;
string reportingMark;
int carNumber;
string kind;
bool loaded;
string destination;
while(inputFile.peek() != EOF)
{
inputFile>>type>>reportingMark>>carNumber>>kind>>loaded;
while(inputFile.peek() == ' ')
inputFile.get();
getline(inputFile, destination);
Car temp(reportingMark, carNumber, kind, loaded, destination);
temp.output();
}
inputFile.close();
}
不要使用 >>
运算符,使用 getline
:
string line;
while (getline(inputFile, line) {
// split line by tabs or commas
}
拆分函数示例:
vector<string> explode(string &str, char separator) {
vector<string> result;
string tmp;
for (int i = 0; i < str.size(); i++) {
if (str[i] == separator) {
result.push_back(tmp);
tmp.clear();
} else tmp += str[i];
}
if (tmp.size() > 0)
result.push_back(tmp);
return result;
}
希望 std::vector
对您来说不难。示例加载代码(而不是 while(inputFile.peek() != EOF) { ... }
):
string line;
while (getline(inputFile, line) {
vector<string> data = split(line, '\t'); // Or use ASCII code 9
if (data.size() != 5) {
cout << "Invalid line!" << endl;
continue;
}
Car temp(data[0], data[1], stoi(data[2]), data[3], data[4]);
temp.output();
}
不要复制粘贴此代码,我看到您有未处理的 bool 变量等。
STL 函数 std::getline
接受分隔符作为第三个参数,这意味着您可以传递 \t
来读取制表符分隔值。对于最后一个值,只需读取它而不指定分隔符,这意味着将在分隔符为 \n
的地方调用函数的重载版本。
一次读取一行,分成标记,转换为所需的数据类型。
Here 是一个工作示例。虽然可以改进。此外,您还应该处理 std::stoi
在 std::string
到 int
转换期间抛出的异常。