处理从一个文本文件到另一个文本的行

时间:2013-09-27 15:54:05

标签: c++ stream xcode5

我要感谢所有帮助我解决问题的人。我终于能够按出生年份安排数据了!非常感谢。如果有人能帮助我解决这个问题,那就太棒了

如果我在文本文件中有这样的行:

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行循环。任何提示赞赏!感谢

2 个答案:

答案 0 :(得分: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" ) ); ),然后您需要的是:

Line

这就是我要做的,但如果你刚刚开始使用C ++,你可能不会 已经涵盖了必要的基础知识,如课程和操作员 重载。

我还会根据您的代码添加一件事:不要访问 您输入的数据没有先检查输入 成功了。

EDIT(仅使用基本功能实现):

如上所述(但没有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>>获取各个字段。一旦你有了 他们,你会想要去除前导和尾随的空白区域 也许转换为数字类型(虽然只是排序 一年,这没有必要)。但所有这一切都符合逻辑 发生在用户定义的Dataoperator<<类中。 (同样,您要提供用户定义的orderByBirthYear来编写 排序后的数据。通常,{{1}},上面, 也是一个班级。)

答案 1 :(得分: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();
}