入力ストリームを使用して最初の整数とコロンを読み取ることができます。ファイル名は最後のエンティティであるため、std::getline
. ただし、ファイル名が最後の部分ではない場合でも、std::getline
それは任意の区切り文字を受け入れる非常に用途の広い関数であることに注意してください。
より高度な方法は、ファイル名の独自のタイプを定義し、それをオーバーロードoperator>>(std::istream &, T const &)
することです。
以下は、基本的な診断といくつかの再フォーマットを使用std::getline
した完全な例です。stringstream
#include <sstream> // for istringstream
#include <iostream> // for cout and cerr
#include <iomanip> // for setprecision
#include <cmath>
bool read (std::string const &line) {
char c = 0;
double length;
double rating;
std::string title;
std::istringstream ss;
ss.str (line);
ss >> length;
if (!ss.good()) { std::cerr << "invalid length\n"; return false; }
if (ss.get()!=':') { std::cerr << "expected colon\n"; return false; }
ss >> rating;
if (!ss.good()) { std::cerr << "invalid rating\n"; return false; }
if (ss.get()!=':') { std::cerr << "expected colon\n"; return false; }
std::getline (ss, title);
double sink;
std::cout << title << " ("
<< int(length) << ':' << 60*std::modf (length,&sink)
<< " min), your rating: " << rating << '\n';
return true;
}
int main () {
read ("30.25:5:Vivaldi - The four seasons.ogg");
read ("3.5:5:Cannibal Corpse - Evisceration Plague.ogg");
read ("meh");
return 0;
}
出力:
Vivaldi - The four seasons.ogg (30:15 min), your rating: 5
Cannibal Corpse - Evisceration Plague.ogg (3:30 min), your rating: 5
invalid length
重要: 解析中は、セキュリティ リスクに近づきます。常に意識的で賢明であり、可能な場合はテスト済みで実証済みのライブラリを使用するようにしてください。これは、 typesafeではなく、エラーが発生しやすく、時には正しく取得するのが難しい を使用しないことsscanf
も意味します。
C++ がある場合は C を使用しないでください。正しく使用すると、iostream は printf/scanf+co よりもさらに便利です。