作者bleed1979 (十三)
看板C_and_CPP
標題Re: Ifstream 讀取的問題
時間Sat Jun 5 20:22:29 2010
隨手寫了一個低效又好笑的取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