0

私の問題を解決してくれたすべての人に感謝したいと思います。ようやくデータを生年順に並べることができました!非常に高く評価。誰かがこの最後の質問で私を助けることができれば、それは素晴らしいことです

テキスト ファイルに次のような行があるとします。

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

このデータを新しいテキスト ファイルに出力するにはどうすればよいでしょうか。ただし、年 - 名前 - 時間の 3 つだけがリストされているため、これらの 2 行は次のようになります。

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

「年は常に各行の 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 に答える
0

まずstd::vector<std::string>、 を使用して行を に読み込みますstd::getline。次に、それらを目的の順序で並べ替えます。次に、それらを出力します。したがってmain、基本的には3行になります。

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++ を始めたばかりの場合は、クラスや演算子のオーバーロードなど、必要な基本事項をまだカバーしていない可能性があります。

コードに基づいて追加したいことの1つは、入力が成功したことを最初に確認せずに、入力したデータにアクセスしないことです。

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、上記の もクラスになります。)

于 2013-09-27T16:26:28.263 に答える