//?yc.cpp?:利用多進程對文件的分塊讀取,并進行系統調用,只需這一個app和yc.h文件?//@version:0.9//@author:yc//@time:25/07/13#include?#include?#include?#include??#include?????//這個頭文件一定要加#include???#include???#include?#include?#include?#include??#include?using?namespace?std;/***int轉為string型*/string?int_to_string(int?num){??ostringstream?oss;??string?c?=?““;??oss?<??c?=oss.str();??return?c;}/**@line_size:每1行有多少字母@line:要讀多少行@count_thread:第幾個進程*/int?get_line_size(int?line_sizeint?lineint?count_thread){ if(count_thread?==?0){ return?0; }else{ return?(line_size?+?1)?*?(line?*?count_thread?-?1)?; }}/*對每行讀取的記錄進行系統調用,來統計該記錄在文件中出現的行號參數內容參見test方法*/void?test_grep(const?char*?in_fileconst?char*?out_filestring?filenameint?thread_numint?line_sizeint?read_line_numint?is_end){ fstream?fout; fout.open(out_fileios::out); ifstream?fin; fin.open(in_fileios::in); int?count_read?=0; fin.seekg(get_line_size(line_sizeread_line_numthread_num)std::ios::cur);?//19739665行是讀取的19739667行,77是一行76個再加1 while(!fin.eof()){ count_read++; string?str_temp?=?““; getline(finstr_temp); char?tmp[1000]; if(is_end?==?0?&&?count_read?>?read_line_num){ break;????//用于不是最后一塊文件的跳出 }else?if(str_temp.size()?<=?2){ break; ?//用于最后1快文件的跳出 }else{ fout< string?sql?=?“grep?-n?\““+str_temp+“\“?“+filename; cout< FILE?*fp?=?popen(sql.c_str()?“r“);???//通過popen函數來實現系統調用,返回1個字符數組,保存的系統調用的命令的結果??? while?(fscanf(fp?“%s“?tmp)?!=?EOF){ for(int?i?=?0;i?18;i++){ if(tmp[i]?!=?‘:‘)fout< else{ fout< break; } } }???????? //puts(tmp); //fout<??? pclose(fp); } }}/*多進程分塊讀取每行固定長
共有 條評論