对于初学者,将这些行读入std::vector<std::string>
, 使用std::getline
. 然后按所需的顺序对它们进行排序。然后输出它们。所以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++,您可能还没有涵盖必要的基础知识,例如类和运算符重载。
根据您的代码,我还要添加一件事:在没有首先检查输入是否成功之前,不要访问您输入的数据。
编辑(仅使用基本功能实现):
如上(但没有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;
}
但我坚持:这不是一个人应该如何解决它。任何合理的解决方案都将从为您的数据定义一个类开始,并使用它定义所有操作。这意味着不仅要定义 a class
,还要定义运算符重载;如果您刚刚开始,您可能还没有看到任何这些(并且就课程质量而言,作业并不是一个好兆头)。
其余的,你在正确的轨道上;对于面向行的输入,您应该阅读使用getline
. 然而,在那之后,该行已从输入中提取出来;要进一步解析它,您需要std::istringstream
用它初始化一个,并从中读取。除了您的输入格式似乎基于列,因此您可能会使用 的substr
功能
std::string
来获取各个字段。一旦你得到它们,你会想要去除前导和尾随空格,并可能转换为数字类型(尽管只是按年份排序,这不是必需的)。但是所有这些在逻辑上都会发生在定义operator>>
给Data
类的用户中。(类似地,您将提供一个用户定义operator<<
来写出排序的数据。通常orderByBirthYear
,上面的 ,也将是一个类。)