0

我要感谢所有帮助我解决问题的人。我终于可以按出生年份排列数据了!非常感谢。如果有人可以帮助我解决最后一个问题,那就太好了

如果我在文本文件中有如下所示的行:

1    4:48:08   Orvar Steingrimsson                 1979   30 - 39 ara      IS200 
2    4:52:25   Gudni Pall Palsson                  1987   18 - 29 ara      IS870 

如何将此数据输出到一个新的文本文件中,但只列出三件事:年份 - 名称 - 时间......这样这两行看起来像这样:

1979   Orvar Steingrimsson   4:48:08
1987   Gudni Pall Palsson    4:52:25

我的猜测是这样的:

ifstream in("inputfile.txt");
ofstream out("outputfile.txt");
int score, year;
string name, time, group, team;
while (getline(in,str));
in >> score >> time >> name >> year >> group >> team;
//and then do something like this
out << year << name << time << '\n';

但是我有一种感觉,我无法在整个文本文件和所有 200 行中循环。任何提示表示赞赏!谢谢

4

2 回答 2

0

对于初学者,将这些行读入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" ) );

当然,readLinessortByBirth需要编写,但它们也都相当琐碎。

或者,可能更好的是,您可以使用、 和和比较函数 ( ) 定义一个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,上面的 ,也将是一个类。)

于 2013-09-27T16:26:28.263 回答
0

“我知道年份总是每行的第 54 到 58 个字符”

所以,考虑一下:

int main ()
{
    ifstream  in("laugavegurinn.txt", ios::in);
    ofstream out("laugavegurinn2.txt");
    string str;
    multimap<int, string> datayear;

    while (getline(in,str)) {
         int year = stoi(str.substr(54, 4));
         datayear.insert(make_pair(year,str)); //use insert function
         // multimap don't have [] operator
           }

    for (auto v : datayear) 
        out << v.second << "\n";

    in.close();
    out.close();
}
于 2013-09-27T17:25:55.117 回答