C語言在TXT檔案中搜索字串
阿新 • • 發佈:2019-02-17
方法一:
bool CBrowseDir::SearchTXT(const char *filename)
{
string filename1( filename );
string keyword( "word" );
ifstream in( filename1.c_str());
if( in )
{
ostringstream os;
os << in.rdbuf();
string content( os.str() );
if( string::npos != content.find( keyword ) )
{
cout << "Find \"" << keyword << "\"!" << endl;
return true;
}else{
cout << "\"" << keyword << "\" Not found!" << endl;
return false;
}
}else{
cerr << "Open file error!" << endl;
return false;
}
return false;
}
Q1:在遇到MSDN幫助文件中一個日誌檔案(.txt,該檔案大於10M)時,程式執行卡住,CPU佔用率很高。
方法二:
bool CBrowseDir::SearchTXT(const char *filename)
{
FILE *fp;
char temp[256];
if((fp=fopen(filename,"rb"))==NULL)
{
printf("不能開啟檔案!!!\n");
return false;
}
while (fgets(temp,255,fp))
{
temp[strlen(temp) -1] = '\0';
if(strstr(temp, m_szKeyWord)!=NULL)
{
printf("%s\n",temp);
fclose(fp);
return true;
}
}
fclose(fp);
return false;
}
用C的方法迴圈按行讀取,大的檔案不會卡住,但在上述該txt檔案中寫入關鍵字(如:test),無法搜尋到該結果。
分析原因:
刪除該檔案內容,寫入測試資料,並打印出來:
檔案內容:
testaabbtest
***EndOfSession***
ettest
test
tet
test
讀取出來並%s打印出來的內容:
結束
記憶體中為亂碼。
建立檔案a.txt,都寫入相同的內容:test
用C32asm檢視:
a.txt檔案內容:
0x74, 0x65, 0x73, 0x74, 0x0D, 0x0A,
日誌.txt檔案內容:
0xFF, 0xFE, 0x74, 0x00, 0x65, 0x00, 0x73, 0x00, 0x74, 0x00,
應該是日誌檔案有自己定義的結構,讀內容無法查詢該內容。