logo

CTDL 2005 chuong 16

Ứng dụng xử lý văn bản
Chöông 16 – ÖÙng duïng xöû lyù vaên baûn Chöông 16 – ÖÙNG DUÏNG XÖÛ LYÙ VAÊN BAÛN Phaàn naøy minh hoïa moät öùng duïng coù söû duïng caû lôùp List vaø String. Ñoù laø moät chöông trình xöû lyù vaên baûn, tuy chæ coù moät vaøi leänh ñôn giaûn, nhöng noù cuõng minh hoïa ñöôïc nhöõng yù töôûng cô baûn ñeå xaây döïng nhöõng chöông trình xöû lyù vaên baûn lôùn vaø tinh teá hôn. 16.1. Caùc ñaëc taû Chöông trình xöû lyù vaên baûn cuûa chuùng ta cho pheùp ñoïc moät taäp tin töø ñóa vaøo boä nhôù maø chuùng ta goïi laø vuøng ñeäm (buffer). Vuøng ñeäm naøy ñöôïc hieän thöïc nhö moät ñoái töôïng cuûa lôùp Editor. Moãi doøng vaên baûn trong ñoái töôïng Editor laø moät String. Do ñoù lôùp Editor seõ ñöôïc thöøa keá töø lôùp List caùc String. Caùc leänh xöû lyù vaên baûn ñöôïc chia laøm hai nhoùm: nhoùm caùc taùc vuï cuûa List seõ xöû lyù cho caùc doøng vaên baûn, vaø nhoùm caùc taùc vuï cuûa String seõ xöû lyù cho caùc kyù töï trong moãi doøng vaên baûn. Taïi moãi thôøi ñieåm, ngöôøi söû duïng coù theå nhaäp hoaëc caùc kyù töï ñeå cheøn vaøo vaên baûn, hoaëc caùc leänh xöû lyù cho phaàn vaên baûn ñaõ coù. Chöông trình xöû lyù vaên baûn caàn bieát boû qua nhöõng kyù töï nhaäp khoâng hôïp leä, nhaän bieát caùc leänh, hoaëc hoûi laïi ngöôøi söû duïng tröôùc khi thöïc hieän caùc leänh quan troïng (chaúng haïn nhö xoùa toaøn boä vuøng ñeäm). Chöông trình xöû lyù vaên baûn coù caùc leänh döôùi ñaây. Moãi leänh seõ ñöôïc ngöôøi söû duïng nhaäp vaøo khi coù daáu nhaéc ‘??’ vaø coù theå nhaäp chöõ hoa hoaëc chöõ thöôøng. ‘R’ (Read) Ñoïc taäp tin vaên baûn vaøo vuøng ñeäm. Teân taäp tin vaên baûn ñaõ ñöôïc chæ ra khi chaïy chöông trình. Noäi dung coù saün trong vuøng ñeäm ñöôïc xoùa saïch. Doøng ñaàu tieân cuûa vaên baûn ñöôïc xem laø doøng hieän taïi. ‘W’(Write) Ghi noäi dung trong vuøng ñeäm vaøo taäp tin vaên baûn coù teân ñaõ ñöôïc chæ ra khi chaïy chöông trình. Vuøng ñeäm cuõng nhö doøng hieän taïi ñeàu khoâng ñoåi. ‘I’ (Insert) Theâm moät doøng môùi. Ngöôøi söû duïng coù theå nhaäp soá thöù töï cuûa doøng môùi seõ ñöôïc theâm vaøo. ‘D’ (Delete) Xoùa doøng hieän taïi vaø chuyeån ñeán doøng keá. ‘F’ (Find) Baét ñaàu töø doøng hieän taïi, tìm doøng ñaàu tieân coù chöùa chuoãi kyù töï do ngöôøi söû duïng yeâu caàu. ‘L’ (Length) Cho bieát soá kyù töï coù trong doøng hieän taïi vaø soá doøng coù trong vuøng ñeäm. ‘C’ (Change) Ñoåi moät chuoãi kyù töï sang moät chuoãi kyù töï khaùc. Chæ ñoåi trong doøng hieän taïi. ‘Q’ (Quit) Thoaùt khoûi chöông trình. ‘H’ (Help) In giaûi thích veà caùc leänh. Coù theå duøng ‘?’ thay cho ‘H’. Giaùo trình Caáu truùc döõ lieäu vaø Giaûi thuaät 387 Chöông 16 – ÖÙng duïng xöû lyù vaên baûn ‘N’ (Next) Chuyeån sang doøng keá trong vuøng ñeäm. ‘P’ (Previous) Trôû veà doøng tröôùc trong vuøng ñeäm. ‘B’ (Beginning) Chuyeån ñeán doøng ñaàu tieân trong vuøng ñeäm. ‘E’ (End) Chuyeån ñeán doøng cuoái trong vuøng ñeäm. ‘G’ (Go) Chuyeån ñeán doøng coù soá thöù töï do ngöôøi söû duïng yeâu caàu. ‘S’ (Subtitute) Thay doøng hieän taïi bôûi doøng do ngöôøi söû duïng nhaäp vaøo. Chöông trình seõ in doøng seõ bò thay theá ñeå kieåm tra laïi vaø hoûi ngöôøi söû duïng nhaäp doøng môùi. ‘V’ (View) Xem toaøn boä noäi dung trong vuøng ñeäm. 16.2. Hieän thöïc 16.2.1. Chöông trình chính Nhieäm vuï ñaàu tieân cuûa chöông trình chính laø söû duïng caùc thoâng soá nhaäp vaøo töø doøng leänh ñeå môû taäp tin ñoïc vaø taäp tin ghi. Caùch söû duïng chöông trình: edit infile outfile trong ñoù infile vaø outfile laø teân taäp tin ñoïc vaø teân taäp tin ghi töông öùng. Khi caùc taäp tin ñaõ môû thaønh coâng, chöông trình khai baùo moät ñoái töôïng Editor goïi laø buffer, laëp laïi vieäc chaïy phöông thöùc get_command cuûa Editor ñeå ñoïc caùc leänh roài xöû lyù caùc leänh naøy. int main(int argc, char *argv[]) // count, values of command-line arguments /* pre: Thoâng soá cuûa doøng leänh laø teân taäp tin ñoïc vaø taäp tin ghi. post: Chöông trình ñoïc noäi dung töø taäp tin ñoïc, cho pheùp soaïn thaûo, chænh söûa vaên baûn, vaø ghi vaøo taäp tin ghi. uses: Caùc phöông thöùc cuûa lôùp Editor. */ { if (argc != 3) { cout Chöông 16 – ÖÙng duïng xöû lyù vaên baûn 16.2.2. Ñaëc taû lôùp Editor Lôùp Editor caàn chöùa moät List caùc ñoái töôïng String, vaø cho pheùp caùc taùc vuï di chuyeån theo caû hai höôùng cuûa List moät caùch hieäu quaû. Chuùng ta cuõng khoâng bieát tröôùc vuøng ñeäm seõ phaûi lôùn bao nhieâu, do ñoù chuùng ta seõ khai baùo lôùp Editor daãn xuaát töø hieän thöïc danh saùch lieân keát keùp (doubly linked list). Lôùp daãn xuaát naøy caàn boå sung theâm hai phöông thöùc get_command vaø run_command maø chöông trình chính seõ goïi. Ngoaøi ra lôùp Editor coøn caàn theâm thuoäc tính ñeå chöùa leänh töø ngöôøi söû duïng (user_command) vaø caùc tham chieáu ñeán doøng nhaäp vaø xuaát (infile vaø outfile). class Editor:public List { public: Editor(ifstream *file_in, ofstream *file_out); bool get_command(); void run_command(); private: ifstream *infile; ofstream *outfile; char user_command; Caùc haøm phuï trôï // Error_code next_line(); Error_code previous_line(); Error_code goto_line(); Error_code insert_line(); Error_code substitute_line(); Error_code change_line(); void read_file(); void write_file(); void find_string(); }; Trong ñaëc taû treân chuùng ta coøn thaáy moät soá haøm phuï trôï ñeå hieän thöïc caùc leänh xöû lyù vaên baûn khaùc nhau. Constructor thöïc hieän noái doøng nhaäp vaø doøng xuaát vôùi ñoái töôïng cuûa lôùp Editor. Editor::Editor(ifstream *file_in, ofstream *file_out) /* post: Khôûi taïo ñoái töôïng Editor vôùi trò cho hai thuoäc tính infile, outfile. */ { infile = file_in; outfile = file_out; } Giaùo trình Caáu truùc döõ lieäu vaø Giaûi thuaät 389 Chöông 16 – ÖÙng duïng xöû lyù vaên baûn 16.2.3. Nhaän leänh töø ngöôøi söû duïng Do chöông trình xöû lyù vaên baûn phaûi bieát boû qua nhöõng kyù töï nhaäp khoâng hôïp leä, neân caùc leänh nhaäp vaøo phaûi ñöôïc kieåm tra kyõ löôõng. Chöông trình duøng haøm tolower chuyeån kyù töï hoa thaønh kyù töï thöôøng coù trong thö vieän , cho pheùp ngöôøi söû duïng coù theå nhaäp chöõ hoa hoaëc chöõ thöôøng. Get_command seõ in doøng hieän taïi, hieän daáu nhaéc chôø leänh, ñoåi leänh sang kyù töï thöôøng. bool Editor::get_command() /* post: Gaùn trò cho thuoäc tính user_command; traû veà true tröø khi ngöôøi söû duïng goõ ‘q’ uses: Haøm tolower cuûa thö vieän C.. */ { if (current != NULL) cout Chöông 16 – ÖÙng duïng xöû lyù vaên baûn if (empty()) cout Chöông 16 – ÖÙng duïng xöû lyù vaên baûn case 'r': read_file(); break; case 's': if (substitute_line() != success) cout Chöông 16 – ÖÙng duïng xöû lyù vaên baûn 16.2.6. Cheøn moät haøng Ñeå cheøn moät doøng môùi, tröôùc heát chuùng ta ñoïc moät chuoãi kyù töï nhôø phöông thöùc read_in cuûa lôùp String trong phaàn 5.3. Sau ñoù chuoãi kyù töï ñöôïc cheøn vaøo List nhôø phöông thöùc insert cuûa List. Chuùng ta khoâng caàn kieåm tra vuøng ñeäm ñaõ ñaày hay chöa do caùc taùc vuï cuûa List ñaõ chòu traùch nhieäm veà vieäc naøy. Error_code Editor::insert_line() /* post: Moä doøng do ngöôøi söû duïng goõ vaøo seõ ñöôïc cheøn vaøo vò trí theo yeâu caàu. uses: Caùc phöông thöùc vaø caùc haøm cuûa String vaø Editor. */ { int line_number; cout line_number; while (cin.get() != '\n'); cout Chöông 16 – ÖÙng duïng xöû lyù vaên baûn 16.2.8. Bieán ñoåi chuoãi kyù töï Haøm change_line nhaän moät chuoãi kyù töï caàn thay theá töø ngöôøi söû duïng. Khi chuoãi kyù töï naøy ñöôïc tìm thaáy trong doøng hieän taïi, ngöôøi söû duïng seõ ñöôïc yeâu caàu nhaäp chuoãi kyù töï ñeå thay theá. Cuoái cuøng laø moät loaït caùc taùc vuï cuûa String vaø C- String ñöôïc thöïc hieän ñeå loaïi chuoãi kyù töï cuõ vaø theá chuoãi kyù töï môùi vaøo. Error_code Editor::change_line() /* pre: Editor ñang chöùa vaên baûn. post: Neáu chuoãi kyù töï ñöôïc yeâu caàu ñöôïc tìm thaáy trong doøng hieän taïi thì seõ ñöôïc thay theá bôûi chuoãi kyù töï khaùc (cuõng do ngöôøi söû duïng goõ vaøo), raû veà success; ngöôïc laïi traû veà fail. uses: Caùc phöông thöùc vaø caùc haøm cuûa String vaø Editor. */ { Error_code result = success; cout entry = new_line; } return result; } Leänh strcat(new_line, (String)(old_line+index+strlen(old_text.c_str()))) tìm con troû taïm chæ vò trí baét ñaàu phaàn coøn laïi ngay sau chuoãi kyù töï ñöôïc thay theá trong doøng cuõ, con troû naøy seõ ñöôïc chuyeån ñoåi thaønh ñoái töôïng String vaø noái vôùi new_line. Giaùo trình Caáu truùc döõ lieäu vaø Giaûi thuaät 394
DMCA.com Protection Status Copyright by webtailieu.net