まず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" ) );
もちろん、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++ を始めたばかりの場合は、クラスや演算子のオーバーロードなど、必要な基本事項をまだカバーしていない可能性があります。
コードに基づいて追加したいことの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
、上記の もクラスになります。)