【发布时间】:2021-03-09 18:36:05
【问题描述】:
我想读取一个文本文件,其中包含以下数据:
Wogger John 2 6.2
Bilbo 111 81.3
Mary 29 154.8
制表符分隔的数据。问题是如果字符串包含空格(例如:'Wogger John'),那么程序就不能工作。如果我将字符串“Wogger John”替换为“Wogger”或“John”,该程序确实有效。如何解决问题?如何使用 getline() 函数。代码如下:
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <cerrno>
#include <cstring>
#include <tuple>
std::vector<std::tuple<std::string, int, double>> Readfile()
{
std::ifstream File("file_read_v3.txt");
std::vector<std::tuple<std::string, int, double>> data;
std::string name;
int a;
double b;
while (File >> name >> a >> b)
{
data.push_back(std::tuple<std::string, int, double>(name, a, b));
}
return data;
}
int main()
{
auto vt = Readfile();
for (const auto& i : vt) {
std::cout << std::get<0>(i) << ", " << std::get<1>(i) << ", " << std::get<2>(i) << std::endl;
}
return 0;
system("pause");
}
【问题讨论】:
-
问题不是代码问题,而是设计问题。显然,尝试将
Wogger John 2 6.2作为string、int、double的格式化 提取发送是行不通的。无论您是否意识到,您都在使用空格作为实体之间的分隔符,同时希望允许它作为您的格式化项目之一的一部分。这永远都行不通。是的,可以破解一个对 int 提取失败采取措施的 getline 解决方案,但这正是它的...... hack。 -
如果不使用元组,它是否按预期工作?问题的关键在于它有助于减少问题,这也是为什么需要minimal reproducible example。
-
也许comma-separated value representation 更适合您的数据。如果不清楚部分是如何分离的,则很难解析。