我要感谢所有帮助我解决问题的人。我终于能够按出生年份安排数据了!非常感谢。如果有人能帮助我解决这个问题,那就太棒了
如果我在文本文件中有这样的行:
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行循环。任何提示赞赏!感谢
答案 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" ) );
当然,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" ) );
),然后您需要的是:
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>>
获取各个字段。一旦你有了
他们,你会想要去除前导和尾随的空白区域
也许转换为数字类型(虽然只是排序
一年,这没有必要)。但所有这一切都符合逻辑
发生在用户定义的Data
到operator<<
类中。
(同样,您要提供用户定义的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();
}