对于初学者,请使用std::getline
将行改为std::vector<std::string>
, 。然后按照需要的顺序对其进行排序。 然后输出它们。所以main
基本上变成三行:
std::vector<Line> data(readLines(inFile));
sortByBirthYear(data);
std::copy(data.begin(), data.end(), std::ostream_iterator<std::string>(outFile, "\n"));
当然,readLines
和sortByBirth
需要写成 好,但他们都相当微不足道的为好。
或者,更好的可能,你可以定义 一个DataLine
类的operator>>
,并operator<<
和 比较函数(operator<
),然后将所有你需要的是:
std::vector<DataLine> data(
(std::istream_iterator<DataLine>(inFile)),
(std::istream_iterator<DataLine>()));
std::sort(data.begin(), data.end());
std::copy(data.begin(),
data.end(),
std::ostream_iterator<std::string>(outFile, "\n"));
那是什么我会这样做,但是如果你刚刚开始使用C++,那么你可能不会覆盖必要的基础知识,例如类和运算符 重载。
我还会根据您的代码添加一件事:请勿访问 您输入的数据,而不要首先检查输入 是否成功。
EDIT(只使用基本功能实现):
如上(但没有Line
型):
std::vector<std::string> data(readLines(inFile));
std::sort(data.begin(), data.end(), orderByBirthYear);
std::copy(data.begin(), data.end(),
std::ostream_iterator<std::string>(outFile, "\n"));
有:
std::vector<std::string>
readLines(std::istream& source)
{
std::vector<std::string> results;
std::string line;
while (std::getline(source, line)) {
results.push_back(line);
}
return results;
}
bool
orderByBirthYear(std::string const& lhs, std::string const& rhs)
{
return lhs.compare(54, 4, rhs, 54, 4) < 0;
}
但我坚持认为:这是不是如何解决它。任何 合理的解决方案将首先为您的 数据定义一个类,并使用它定义所有操作。这意味着 不仅仅定义了class
,还包含了运算符重载;如果您刚刚开始 ,您可能还没有看到任何这些 (并且该作业对于该课程的质量而言不是一个好迹象)。
其余的,你在正确的轨道上;对于面向行的 输入,您应该阅读使用getline
。然而,在那之后, 该行已经从输入中提取出来;要进一步解析它, 您需要用它初始化一个std::istringstream
,并从中读取 。除了您的输入格式似乎基于 列,因此您可能使用substr
函数 std::string
来获取单个字段。一旦你有 他们,你会想要去掉前导空白和尾随空白,并且 可能会转换为数字类型(虽然只需排序 年,这是没有必要的)。但是所有这些在逻辑上会在用户定义的operator>>
到Data
类中发生。 (同样,你会提供定义operator<<
写 排序的数据出来,而且通常情况下,orderByBirthYear
,上面 将是一个类,以及用户。)
我不会用C++这个 – P0W
这是什么意思?我刚开始一个C++类,我们被要求这样做。今天晚上到期的巨大任务,我无法获得帮助,因为我在UNI中几乎不认识一个人。我知道其他人只是帮助彼此分享代码。但是我必须自己来做这件事,可惜的是,在C++中! –
为什么你要逐一提取第1〜第2〜3〜6行? – P0W