看板 C_and_CPP 關於我們 聯絡資訊
隨手寫了一個低效又好笑的取token函式︰ void split ( string &s, vector< string >& vec, const char* delim ) { vec.clear (); int len = s.length (), prev = 0; for ( int i = 0; i != len; ++i ) for ( char* p = ( char* ) delim; *p; ++p ) if ( s[ i ] == *p ) { if ( i - prev > 0 ) { string token = s.substr ( prev, i - prev ); vec.push_back ( token ); } prev = i + 1; break; } if ( len - prev > 0 ) { string token = s.substr ( prev, len - prev ); vec.push_back ( token ); } } 用法大概是這樣︰ int main () { string row; fstream fin ( "in.dat" ); while ( getline ( fin, row, '\n' ) ) { vector< string > data; split ( row, data, "\\&" ); int size = data.size (); for ( int i = 0; i != size; ++i ) cout << data[ i ] << "\n"; cout << "\n"; } ... ... ... ... ... ... (略) return ( 0 ); } split函式的delim可以填入想濾掉的字串,字串裡面的字元就填入想濾掉的字元。 此例我是用"\\&", 所以在vector最後一個欄位的值就會是︰ 2000 1 123456789 考慮書名和作者可能都會有空白,所以才不濾空白,要抽取ISBN就必須做進一步處理。 但如果您執意只找ISBN的話,可以改用濾"\\& "的方式(將空白加入)。 ISBN就會是vector的最後一個欄位,型態是字串。 ISBN的欄位好像有10位和13位的樣子,我不是很懂。 不過這個split函式應該都可以處理。 Bleed ※ 引述《RaiGend0519 (鮮度減半,老了0.5歲囧)》之銘言: : 現在我有一個.dat : 裡面有一行字組是\&HarryPotter&\\&JK&\2000 1 123456789 : 第一個是書名 : 然後是作者 : 再來是年份、版序、國際書碼 : 如果我現在想要用搜尋國際書碼的方式 : 來刪掉這一行字組 : 我該怎麼做呢? : 遇到的瓶頸是 : \& &\這個在讀取時不知道要怎麼繞過去 : 如果是空格的話就會乖乖讀近來 : 加了這兩個符號不知道該怎麼辦... -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.25.211.84
loveme00835:可以用strtok兜起來, 不用自己寫判斷 06/05 20:38
loveme00835:但是如果用Regular Expression 的話, 會比較棘手些 06/05 20:47
bleed1979:其實主題原po用fstream,我猜應該不是用c style string 06/05 20:51
loveme00835:可以用 string::c_str() 跟 c 函式庫銜接起來 06/05 20:53