Re: Ifstream 讀取的問題
隨手寫了一個低效又好笑的取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
→
06/05 20:38, , 1F
06/05 20:38, 1F
→
06/05 20:47, , 2F
06/05 20:47, 2F
→
06/05 20:51, , 3F
06/05 20:51, 3F
→
06/05 20:53, , 4F
06/05 20:53, 4F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 3 之 3 篇):