ធ្វើការជាមួយឯកសារអត្ថបទនៅក្នុង C ++ ។
មានឯកសារពីរប្រភេទសំខាន់ៗ៖ អត្ថបទ និងប្រព័ន្ធគោលពីរ។ ឯកសារអនុញ្ញាតឱ្យអ្នកប្រើអានទិន្នន័យយ៉ាងច្រើនដោយផ្ទាល់ពីថាសដោយមិនចាំបាច់បញ្ចូលវាពីក្តារចុច។
អត្ថបទឯកសារដែលមានតួអក្សរណាមួយត្រូវបានហៅ។ ពួកវាត្រូវបានរៀបចំជាបន្ទាត់ ដែលនីមួយៗបញ្ចប់ដោយតួអក្សរចុងបន្ទាត់។ ចុងបញ្ចប់នៃឯកសារខ្លួនវាត្រូវបានចង្អុលបង្ហាញដោយនិមិត្តសញ្ញា "ចុងបញ្ចប់នៃឯកសារ" ។ នៅពេលសរសេរព័ត៌មានទៅឯកសារអត្ថបទ ដែលអាចមើលបានដោយប្រើកម្មវិធីនិពន្ធអត្ថបទ ទិន្នន័យទាំងអស់ត្រូវបានបំប្លែងទៅជាប្រភេទតួអក្សរ ហើយរក្សាទុកក្នុងទម្រង់តួអក្សរ។
IN គោលពីរនៅក្នុងឯកសារ ព័ត៌មានត្រូវបានអាន និងសរសេរជាទម្រង់ប្លុកនៃទំហំជាក់លាក់មួយ ដែលទិន្នន័យនៃប្រភេទ និងរចនាសម្ព័ន្ធណាមួយអាចត្រូវបានរក្សាទុក។
ដើម្បីធ្វើការជាមួយឯកសារ ពិសេស ប្រភេទទិន្នន័យ, បានហៅ ស្ទ្រីម. លំហូរ ifstreamត្រូវបានប្រើដើម្បីធ្វើការជាមួយឯកសារក្នុងរបៀបអាន និង នៃចរន្តនៅក្នុងរបៀបថត។ ដើម្បីធ្វើការជាមួយឯកសារទាំងក្នុងរបៀបសរសេរ និងអាន ស្ទ្រីមត្រូវបានប្រើ fstream.
នៅក្នុងកម្មវិធី C++ នៅពេលធ្វើការជាមួយឯកសារអត្ថបទ អ្នកត្រូវតែបញ្ចូលបណ្ណាល័យ iostream និង fstream ។
ដើម្បី កត់ទុកទិន្នន័យទៅឯកសារអត្ថបទ អ្នកត្រូវការ៖
ពិពណ៌នាអំពីអថេរនៃប្រភេទនៃចរន្ត។
បញ្ជូនព័ត៌មានទៅឯកសារ។
ត្រូវប្រាកដថាបិទឯកសារ។
សម្រាប់ ការអានទិន្នន័យពីឯកសារអត្ថបទ អ្នកត្រូវការ៖
ពិពណ៌នាអថេរនៃប្រភេទ ifstream ។
បើកឯកសារដោយប្រើមុខងារបើក។
បិទឯកសារ។
កត់ត្រាព័ត៌មានទៅកាន់ឯកសារអត្ថបទ
ដូចដែលបានរៀបរាប់ខាងលើ ដើម្បីចាប់ផ្តើមធ្វើការជាមួយឯកសារអត្ថបទ អ្នកត្រូវកំណត់អថេរនៃប្រភេទចរន្ត។ ឧទាហរណ៍ដូចនេះ៖
អថេរ F នឹងត្រូវបានបង្កើតដើម្បីសរសេរព័ត៌មានទៅឯកសារ។
នៅដំណាក់កាលបន្ទាប់ ឯកសារត្រូវតែបើកសម្រាប់ការសរសេរ។ ជាទូទៅ ប្រតិបត្តិករបើកការផ្សាយនឹងមើលទៅដូច៖
F.open("ឯកសារ", របៀប);
នៅទីនេះ F គឺជាអថេរដែលត្រូវបានពិពណ៌នាថាជាចរន្ត,
ឯកសារ - ឈ្មោះពេញរបស់ឯកសារនៅលើថាស,
របៀប - របៀបធ្វើការជាមួយឯកសារដែលកំពុងបើក។
សូមចំណាំថានៅពេលបញ្ជាក់ឈ្មោះឯកសារពេញលេញ អ្នកត្រូវតែប្រើសញ្ញាចុចពីរដង។ ឧទាហរណ៍ ឈ្មោះពេញរបស់ឯកសារ noobs.txt ដែលមានទីតាំងនៅក្នុងថតហ្គេមនៅលើ drive D: នឹងត្រូវសរសេរដូចនេះ៖
D:\\game\\noobs.txt.
ឯកសារអាចត្រូវបានបើកនៅក្នុងរបៀបមួយក្នុងចំណោមរបៀបខាងក្រោម៖
ios::in - បើកឯកសារក្នុងរបៀបអានទិន្នន័យ របៀបនេះគឺជារបៀបលំនាំដើមសម្រាប់ ifstreams;
ios::out - បើកឯកសារក្នុងរបៀបសរសេរទិន្នន័យ (ក្នុងករណីនេះព័ត៌មានអំពីឯកសារដែលមានស្រាប់ត្រូវបានបំផ្លាញ) របៀបនេះគឺជារបៀបលំនាំដើមសម្រាប់ offstreams ។
ios::app - បើកឯកសារក្នុងរបៀបសរសេរទិន្នន័យទៅចុងបញ្ចប់នៃឯកសារ។
ios::ate - ផ្លាស់ទីទៅចុងបញ្ចប់នៃឯកសារដែលបានបើករួចហើយ;
ios::trunc - ជម្រះឯកសារ វាក៏កើតឡើងនៅក្នុង ios::out mode;
ios::nocreate - កុំបើកឯកសារប្រសិនបើវាមិនមាន។
ios::noreplace - កុំបើកឯកសារដែលមានស្រាប់។
ប៉ារ៉ាម៉ែត្ររបៀបអាចនឹងអវត្តមាន ដែលក្នុងករណីដែលឯកសារត្រូវបានបើកក្នុងរបៀបលំនាំដើមសម្រាប់ការផ្សាយនេះ។
បន្ទាប់ពីការបើកឯកសារដោយជោគជ័យ (ក្នុងរបៀបណាមួយ) អថេរ F នឹងរក្សាទុកពិត បើមិនដូច្នេះទេមិនពិត។ វានឹងអនុញ្ញាតឱ្យអ្នកពិនិត្យមើលភាពត្រឹមត្រូវនៃប្រតិបត្តិការបើកឯកសារ។
អ្នកអាចបើកឯកសារមួយ (សូមយកឯកសារ D:\\game\\noobs.txt ជាឧទាហរណ៍) នៅក្នុងរបៀបថតតាមវិធីមួយដូចខាងក្រោម៖
// ដំបូង វិធី
ចរន្ត F;
F.open("D:\\game\\noobs.txt", ios::out);
// វិធីសាស្រ្តទីពីរ ios::out mode គឺជារបៀបលំនាំដើម
// សម្រាប់ លំហូរនៃចរន្ត
ចរន្ត F;
// វិធីសាស្ត្រទីបីរួមបញ្ចូលគ្នានូវការពិពណ៌នានៃអថេរ និងប្រភេទស្ទ្រីម
// ហើយបើកឯកសារក្នុងសេចក្តីថ្លែងការណ៍មួយ។
ofstream F("D:\\game\\noobs.txt", ios::out);
បន្ទាប់ពីបើកឯកសារក្នុងរបៀបសរសេរ ឯកសារទទេនឹងត្រូវបានបង្កើត ដែលអ្នកអាចសរសេរព័ត៌មានបាន។
ប្រសិនបើអ្នកចង់បើកឯកសារដែលមានស្រាប់ក្នុងទម្រង់ write-first អ្នកគួរតែប្រើ ios::app ជារបៀប។
បន្ទាប់ពីបើកឯកសារក្នុងរបៀបថត អ្នកអាចសរសេរទៅវាតាមវិធីដូចគ្នានឹងអេក្រង់ តែជំនួសឱ្យឧបករណ៍លទ្ធផលស្តង់ដារប៉ុណ្ណោះcoutអ្នកត្រូវតែបញ្ជាក់ឈ្មោះឯកសារដែលបើក។
ឧទាហរណ៍ ដើម្បីសរសេរអថេរ a ដើម្បីស្ទ្រីម F សេចក្តីថ្លែងការណ៍លទ្ធផលនឹងមើលទៅដូច៖
សម្រាប់ទិន្នផលបន្តបន្ទាប់គ្នាដើម្បីស្ទ្រីម G នៃអថេរ b, c, d ប្រតិបត្តិករលទ្ធផលនឹងក្លាយទៅជាដូចនេះ៖
ជី<
ការបិទការផ្សាយត្រូវបានធ្វើឡើងដោយប្រើប្រតិបត្តិករ៖
ឧទាហរណ៍៖
បង្កើតឯកសារអត្ថបទ D:\\game\\noobs.txt ហើយសរសេរលេខពិតទៅក្នុងវា។
# រួមបញ្ចូល "stdafx.h"
# រួមបញ្ចូល
# រួមបញ្ចូល
# រួមបញ្ចូល
ដោយប្រើ namespace std;
int main()
setlocale(LC_ALL, "RUS");
int ខ្ញុំ, n;
ទ្វេដង a;
// ពិពណ៌នាអំពីស្ទ្រីមសម្រាប់ការសរសេរទិន្នន័យទៅឯកសារ
នៃចរន្ត f;
// បើកឯកសារក្នុងរបៀបសរសេរ,
// របៀបអាយអូអេស:: ចេញបានដំឡើងតាមលំនាំដើម
f.open("D:\\game\\noobs.txt", ios::out);
// បញ្ចូលចំនួននៃចំនួនពិត
cout<<" ន="; ស៊ីន>> ន;
// រង្វិលជុំសម្រាប់បញ្ចូលលេខពិត
// ហើយសរសេរពួកវាទៅក្នុងឯកសារ
សម្រាប់ (i=0; i
cout<<"a=";
// បញ្ចូលលេខ
cin >> a;
// បិទស្ទ្រីម
f.close();
ប្រព័ន្ធ ("ផ្អាក");
ត្រឡប់ 0;
_______________________________________________________________
ដើម្បីអានព័ត៌មានពីឯកសារអត្ថបទ អ្នកត្រូវពណ៌នាអថេរដូច ifstream. បន្ទាប់ពីនេះអ្នកត្រូវបើកឯកសារសម្រាប់ការអានដោយប្រើប្រតិបត្តិករ បើក. ប្រសិនបើអថេរត្រូវបានគេហៅថា F នោះសេចក្តីថ្លែងការណ៍ពីរដំបូងនឹងដូចនេះ៖
F.open("D:\\game\\noobs.txt", ios::in);
បន្ទាប់ពីបើកឯកសារក្នុងរបៀបអាន អ្នកអាចអានព័ត៌មានពីវាតាមរបៀបដូចគ្នានឹងក្តារចុចដែរ ជំនួសវិញ។ស៊ីនបញ្ជាក់ឈ្មោះរបស់ស្ទ្រីមដែលទិន្នន័យនឹងត្រូវបានអាន។
ឧទាហរណ៍ ដើម្បីអានពីស្ទ្រីម F ទៅជាអថេរ a សេចក្តីថ្លែងការណ៍បញ្ចូលនឹងមើលទៅដូចនេះ៖
លេខពីរនៅក្នុងកម្មវិធីនិពន្ធអត្ថបទត្រូវបានចាត់ទុកថាបំបែកប្រសិនបើមានយ៉ាងហោចណាស់តួអក្សរមួយរវាងពួកវា៖ ចន្លោះ ផ្ទាំង ចុងបន្ទាត់។ វាល្អប្រសិនបើអ្នកសរសេរកម្មវិធីដឹងជាមុនថាតើចំនួនប៉ុន្មាន និងតម្លៃអ្វីខ្លះដែលត្រូវរក្សាទុកក្នុងឯកសារអត្ថបទ។ ទោះជាយ៉ាងណាក៏ដោយជាញឹកញាប់ប្រភេទនៃតម្លៃដែលរក្សាទុកក្នុងឯកសារត្រូវបានគេស្គាល់យ៉ាងសាមញ្ញប៉ុន្តែចំនួនរបស់ពួកគេអាចប្រែប្រួល។ ដើម្បីដោះស្រាយបញ្ហានេះ អ្នកត្រូវអានតម្លៃពីឯកសារម្តងមួយៗ ហើយមុនពេលអាននីមួយៗ សូមពិនិត្យមើលថាតើចុងបញ្ចប់នៃឯកសារបានទៅដល់ឬអត់។ មានមុខងារសម្រាប់រឿងនេះ ច. អេហ្វ().
នៅទីនេះ F គឺជាឈ្មោះរបស់ខ្សែស្រឡាយ មុខងារត្រឡប់តម្លៃប៊ូលីន៖ ពិត ឬមិនពិត អាស្រ័យលើថាតើចុងបញ្ចប់នៃឯកសារត្រូវបានទៅដល់។ ដូច្នេះ រង្វិលជុំដើម្បីអានខ្លឹមសារនៃឯកសារទាំងមូលអាចត្រូវបានសរសេរដូចនេះ៖
// រៀបចំសម្រាប់ការអានតម្លៃពីឯកសារមួយ ការប្រតិបត្តិ
// រង្វិលជុំនឹងបំបែកនៅពេលដែលយើងទៅដល់ចុងបញ្ចប់នៃឯកសារ
// ក្នុងករណីនេះ F.eof() នឹងត្រឡប់ពិត
ខណៈពេលដែល (!F.eof())
ឧទាហរណ៍៖
ឯកសារអត្ថបទ D:\\game\\noobs.txt រក្សាទុកចំនួនពិត បង្ហាញពួកវានៅលើអេក្រង់ និងគណនាលេខរបស់ពួកគេ។
# រួមបញ្ចូល "stdafx.h"
# រួមបញ្ចូល
# រួមបញ្ចូល
# រួមបញ្ចូល
# រួមបញ្ចូល
ដោយប្រើ namespace std;
int main()
setlocale(LC_ALL, "RUS");
int n=0;
អណ្តែត a;
fstream F;
// បើកឯកសារក្នុងរបៀបអាន
F.open("D:\\game\\noobs.txt");
// ប្រសិនបើឯកសារត្រូវបានបើកត្រឹមត្រូវ។
// រង្វិលជុំសម្រាប់ការអានតម្លៃពីឯកសារមួយ; ការប្រតិបត្តិរង្វិលជុំនឹងត្រូវបានរំខាន,
// នៅពេលដែលយើងឈានដល់ចុងបញ្ចប់នៃឯកសារ ក្នុងករណីនេះ F.eof() នឹងត្រឡប់ពិត។
ខណៈពេលដែល (!F.eof())
// អានតម្លៃបន្ទាប់ពីស្ទ្រីម F ទៅជាអថេរ a
F>>a;
// បញ្ចេញតម្លៃនៃអថេរ a ទៅអេក្រង់
// បង្កើនចំនួនលេខដែលបានអាន
// បិទស្ទ្រីម
F.close();
// បញ្ចូលចំនួនលេខដែលបានអាននៅលើអេក្រង់
cout<<"n="<
// ប្រសិនបើការបើកឯកសារមិនត្រឹមត្រូវ នោះលទ្ធផល
// សារអំពីអវត្តមាននៃឯកសារបែបនេះ
cout ផ្សេងទៀត។<<" Файл не существует"<
ប្រព័ន្ធ ("ផ្អាក");
ត្រឡប់ 0;
C++ ។ ដំណើរការឯកសារគោលពីរ
នៅពេលសរសេរព័ត៌មានទៅឯកសារគោលពីរ តួអក្សរ និងលេខត្រូវបានសរសេរជាលំដាប់នៃបៃ។
ដើម្បី កត់ទុកទិន្នន័យទៅឯកសារគោលពីរ អ្នកត្រូវការ៖
ពិពណ៌នាអំពីអថេរឯកសារនៃប្រភេទ FAIL * ដោយប្រើប្រតិបត្តិករ FILE *ឈ្មោះឯកសារ។ នៅទីនេះឈ្មោះឯកសារគឺជាឈ្មោះនៃអថេរដែលទ្រនិចទៅឯកសារនឹងត្រូវបានរក្សាទុក។
សរសេរព័ត៌មានទៅឯកសារដោយប្រើមុខងារ fwrite
ដើម្បី ពិចារណា b ទិន្នន័យពីឯកសារគោលពីរ អ្នកត្រូវការ៖
ពណ៌នាអថេរនៃប្រភេទ FILE *
បើកឯកសារដោយប្រើមុខងារ fopen
បិទឯកសារដោយប្រើមុខងារ fclose
មុខងារជាមូលដ្ឋានតម្រូវឱ្យធ្វើការជាមួយឯកសារគោលពីរ។
សម្រាប់ ការរកឃើញឯកសារត្រូវបានបម្រុងទុកសម្រាប់មុខងារ fopen ។
ឯកសារ * fopen (const * ឈ្មោះឯកសារ, const char * របៀប)
នៅទីនេះឈ្មោះឯកសារគឺជាខ្សែអក្សរដែលរក្សាទុកឈ្មោះពេញរបស់ឯកសារដែលកំពុងបើក របៀបគឺជាខ្សែអក្សរដែលកំណត់របៀបសម្រាប់ធ្វើការជាមួយឯកសារ។ តម្លៃខាងក្រោមគឺអាចធ្វើទៅបាន៖
"rb" - បើកឯកសារគោលពីរក្នុងរបៀបអាន;
“wb” - បង្កើតឯកសារគោលពីរសម្រាប់ការថត។ ប្រសិនបើវាមាន មាតិការបស់វាត្រូវបានសម្អាត។
“ab” - បង្កើត ឬបើកឯកសារគោលពីរ ដើម្បីបន្ថែមទៅចុងបញ្ចប់នៃឯកសារ។
“rb+” - បើកឯកសារគោលពីរដែលមានស្រាប់ក្នុងរបៀបអាន-សរសេរ។
“wb+” - បើកឯកសារគោលពីរក្នុងរបៀបអាន-សរសេរ ឯកសារដែលមានស្រាប់ត្រូវបានសម្អាត។
"ab+" - ឯកសារគោលពីរត្រូវបានបើក ឬបង្កើតដើម្បីកែព័ត៌មានដែលមានស្រាប់ និងបន្ថែមព័ត៌មានថ្មីទៅចុងបញ្ចប់នៃឯកសារ។
មុខងារត្រឡប់ NULL ក្នុងអថេរឯកសារ f ប្រសិនបើឯកសារបើកមិនជោគជ័យ។ បន្ទាប់ពីបើកឯកសារមួយ បៃទី 0 របស់វាអាចប្រើបាន ទ្រនិចឯកសារគឺ 0 តម្លៃដែលវាត្រូវបានផ្លាស់ប្តូរតាមចំនួនបៃដែលបានអាន (សរសេរ) ។ តម្លៃបច្ចុប្បន្ននៃទ្រនិចឯកសារគឺជាចំនួនបៃដែលប្រតិបត្តិការអាន ឬសរសេរនឹងកើតឡើង។
សម្រាប់ ការបិទឯកសារត្រូវបានបម្រុងទុកសម្រាប់មុខងារ fclose
int fclose (ឯកសារ * ឈ្មោះឯកសារ);
ត្រឡប់ 0 ប្រសិនបើឯកសារត្រូវបានបិទដោយជោគជ័យ នោះ NULL បើមិនដូច្នេះទេ។
មុខងារដកចេញគឺសម្រាប់ ការដកយកចេញឯកសារ។
int remove(const char *filename);
មុខងារនេះលុបឯកសារដែលមានឈ្មោះ filenema ចេញពីថាស។ ឯកសារដែលត្រូវលុបត្រូវតែបិទ។ អនុគមន៍ត្រឡប់តម្លៃមិនសូន្យ ប្រសិនបើឯកសារមិនអាចត្រូវបានលុប។
សម្រាប់ ការប្តូរឈ្មោះឯកសារ មុខងារប្តូរឈ្មោះគឺមានបំណង៖
int rename(const char *oldfilename, const char *newfilename);
ប៉ារ៉ាម៉ែត្រទីមួយគឺឈ្មោះឯកសារចាស់ ទីពីរគឺថ្មី។ ត្រឡប់ 0 ប្រសិនបើកម្មវិធីបញ្ចប់ដោយជោគជ័យ។
ការអានពីឯកសារគោលពីរត្រូវបានធ្វើដោយប្រើមុខងារ fread:
fread (ចាត់ទុកជាមោឃៈ *ptr, ទំហំ, n, ឯកសារ * ឈ្មោះឯកសារ);
មុខងារ fread អានធាតុ n នៃទំហំទំហំពីឈ្មោះឯកសារទៅជាអារេ ptr ។ មុខងារត្រឡប់ចំនួនធាតុដែលបានអាន។ បន្ទាប់ពីអានពីឯកសារ ទ្រនិចរបស់វាត្រូវបានផ្លាស់ប្តូរដោយ n*size bytes។
កត់ត្រាទៅឯកសារគោលពីរត្រូវបានធ្វើដោយប្រើមុខងារ fwrite៖
fwrite(const void *ptr, size, n, FILE *filename);
មុខងារ fwrite សរសេរទៅឈ្មោះឯកសារពីអារេ ptr នៃធាតុ n នៃទំហំទំហំ។ អនុគមន៍ត្រឡប់ចំនួនធាតុដែលបានសរសេរ។ បន្ទាប់ពីសរសេរព័ត៌មានទៅឯកសារ ទ្រនិចត្រូវបានផ្លាស់ប្តូរដោយ n*size bytes។
សម្រាប់ ការគ្រប់គ្រងឯកសារបញ្ចប់មានមុខងារ feof:
int feof (ឯកសារ * ឈ្មោះឯកសារ);
វាត្រឡប់តម្លៃមិនមែនសូន្យ ប្រសិនបើចុងបញ្ចប់នៃឯកសារត្រូវបានឈានដល់។
ឧទាហរណ៍៖
បង្កើតឯកសារគោលពីរ D:\\game\\noobs.dat ហើយសរសេរ n ចំនួនគត់ និង n ចំនួនពិតទៅក្នុងវា។
# រួមបញ្ចូល "stdafx.h"
# រួមបញ្ចូល
ដោយប្រើ namespace std;
int main()
setlocale(LC_ALL, "RUS");
int n, ខ្ញុំ;
ទ្វេដង a;
// បង្កើតឯកសារគោលពីរក្នុងរបៀបសរសេរ
f=fopen("D:\\game\\noobs.dat", "wb");
// បញ្ចូល លេខន
cout<<"n="; cin>> n;
fwrite(&n, sizeof(int), 1, f);
// រង្វិលជុំដើម្បីបញ្ចូលលេខពិត
សម្រាប់ (i=0; i
// បញ្ចូលលេខពិតបន្ទាប់
cout<<"a=";
cin >> a;
// សរសេរលេខពិតទៅឯកសារគោលពីរ
fwrite(&a, sizeof(ទ្វេ), 1, f);
// ជិត ឯកសារ
fclose(f);
ប្រព័ន្ធ ("ផ្អាក");
ត្រឡប់ 0;
ឧទាហរណ៍៖
បង្ហាញមាតិកានៃឯកសារគោលពីរ D:\\game\\noobs.dat ដែលបានបង្កើតនៅក្នុងកិច្ចការមុន។
# រួមបញ្ចូល "stdafx.h"
# រួមបញ្ចូល
ដោយប្រើ namespace std;
int main()
setlocale(LC_ALL, "RUS");
int n, ខ្ញុំ;
ទ្វេ * a;
ឯកសារ * f; // ពិពណ៌នាអំពីអថេរឯកសារ
// បើកឯកសារគោលពីរដែលមានស្រាប់ក្នុងរបៀបអាន
// អានចំនួនគត់ពីឯកសារទៅជា variable n
// លទ្ធផល n ទៅអេក្រង់
cout<<"n="<
// ការបែងចែកអង្គចងចាំសម្រាប់អារេនៃលេខ n
a=new double[n];
// អានលេខពិតពីឯកសារទៅជាអារេ a
// បញ្ចេញអារេទៅអេក្រង់
សម្រាប់ (i=0; i
cout<
// ជិត ឯកសារ
fclose(f);
ប្រព័ន្ធ ("ផ្អាក");
ត្រឡប់ 0;
ឯកសារគោលពីរ- រចនាសម្ព័ន្ធទិន្នន័យតាមលំដាប់លំដោយ បន្ទាប់ពីបើកឯកសារមួយ បៃដំបូងដែលរក្សាទុកក្នុងវាមាន។ អ្នកអាចសរសេរ ឬអានទិន្នន័យពីឯកសារតាមលំដាប់លំដោយ។ ឧបមាថាអ្នកត្រូវរាប់លេខដប់ប្រាំហើយបន្ទាប់មកលេខដំបូង។ ការប្រើការចូលដំណើរការតាមលំដាប់លំដោយ នេះអាចត្រូវបានធ្វើតាមវិធីខាងក្រោម៖
int n, ខ្ញុំ;
ទ្វេដង a;
ឯកសារ * f;
f=fopen("D:\\game\\noobs.dat", "rb");
សម្រាប់ (i=0; i<15; i++)
fclose(f);
f=fopen("D:\\game\\noobs.dat", "rb");
fread(&a, sizeof(ទ្វេ), 1, f);
fclose(f);
ដូចដែលអ្នកអាចឃើញការអានលេខពីឯកសារមួយហើយបន្ទាប់មកបើកឯកសារម្តងទៀតមិនមែនជាវិធីងាយស្រួលបំផុតនោះទេ។ វានឹងកាន់តែងាយស្រួលប្រើមុខងារ fseek ដើម្បីផ្លាស់ទីទ្រនិចឯកសារទៅបៃដែលបានផ្តល់ឱ្យ។
int fseek (ឯកសារ * ឈ្មោះឯកសារ, អុហ្វសិត int វែង, ប្រភពដើម int);
មុខងារកំណត់ទ្រនិចទីតាំងឯកសារបច្ចុប្បន្នដោយអនុលោមតាមប្រភពដើម និងតម្លៃអុហ្វសិត។ ប៉ារ៉ាម៉ែត្រអុហ្វសិតគឺស្មើនឹងចំនួនបៃដែលទ្រនិចឯកសារនឹងត្រូវបានអុហ្វសិតទាក់ទងទៅនឹងប្រភពដើមដែលបានបញ្ជាក់ដោយប៉ារ៉ាម៉ែត្រប្រភពដើម។ តម្លៃសម្រាប់ប៉ារ៉ាម៉ែត្រប្រភពដើមត្រូវតែជាតម្លៃអុហ្វសិតមួយក្នុងចំណោមតម្លៃអុហ្វសិតខាងក្រោមដែលបានកំណត់ក្នុងបឋមកថា stdio.h៖
SEEK_SET - ពីដើមឯកសារ;
SEEK_CUR - ពីទីតាំងបច្ចុប្បន្ន;
SEEK_END - ពីចុងបញ្ចប់នៃឯកសារ។
អនុគមន៍ត្រឡប់តម្លៃសូន្យ ប្រសិនបើប្រតិបត្តិការបានជោគជ័យ ជាតម្លៃមិនសូន្យ ប្រសិនបើអុហ្វសិតបរាជ័យ។
មុខងារ fseek ពិតជាអនុវត្តការចូលដោយផ្ទាល់ទៅកាន់តម្លៃណាមួយនៅក្នុងឯកសារ។ អ្នកគ្រាន់តែត្រូវដឹងពីទីតាំង (លេខបៃ) នៃតម្លៃក្នុងឯកសារ។ សូមក្រឡេកមើលការប្រើប្រាស់ការចូលដោយផ្ទាល់នៅក្នុងឯកសារគោលពីរដោយប្រើបញ្ហាខាងក្រោមជាឧទាហរណ៍។
ឧទាហរណ៍
នៅក្នុងឯកសារគោលពីរ D:\\game\\noobs.dat ដែលបានបង្កើតមុននេះ ប្តូរលេខពិតធំបំផុត និងតូចបំផុត។
ក្បួនដោះស្រាយសម្រាប់ដោះស្រាយបញ្ហាមានដំណាក់កាលដូចខាងក្រោមៈ
ការអានការពិតពីឯកសារទៅក្នុងអារេ a.
ស្វែងរកក្នុងអារេ a សម្រាប់តម្លៃអតិបរមា (អតិបរមា) និងអប្បបរមា (អប្បបរមា) និងលេខរបស់ពួកគេ (imax, imin) ។
ផ្លាស់ទីទ្រនិចឯកសារទៅតម្លៃអតិបរមា ហើយសរសេរអប្បបរមា។
ផ្លាស់ទីទ្រនិចឯកសារទៅតម្លៃអប្បបរមា និងសរសេរអតិបរមា។
ខាងក្រោមនេះជាអត្ថបទនៃកម្មវិធីសម្រាប់ដោះស្រាយបញ្ហាជាមួយមតិយោបល់។
# រួមបញ្ចូល "stdafx.h"
# រួមបញ្ចូល
ដោយប្រើ namespace std;
int main()
setlocale(LC_ALL, "RUS");
int n, i, imax, imin;
ទ្វេ * a, អតិបរមា, នាទី;
ឯកសារ * f;
// បើកឯកសារក្នុងរបៀបអាន-សរសេរ
f=fopen("D:\\game\\noobs.dat", "rb+");
// អានលេខពីឯកសារទៅជាអថេរ n
// ចំនួនពិតនៅក្នុងឯកសារ
fread(&n, sizeof(int), 1, f);
cout<<"n="<
// បែងចែកអង្គចងចាំសម្រាប់រក្សាទុកចំនួនពិត,
// ដែលនឹងត្រូវបានរក្សាទុកក្នុងអារេ a
a=new double[n];
// អានពីឯកសារទៅជាអារេ និងចំនួនពិត
fread (a, sizeof (ទ្វេ), n, f);
// ស្វែងរកធាតុអតិបរមានិងអប្បបរមា
// នៅក្នុងអារេ a និងសន្ទស្សន៍របស់ពួកគេ។
សម្រាប់ (imax=imin=0, max=min=a, i=1; i
ប្រសិនបើ (a[i]> អតិបរមា)
អតិបរមា=a[i];
ប្រសិនបើ (a[i]
min=a[i];
// ផ្លាស់ទី ទ្រនិច ទៅ អតិបរមា ធាតុ
fseek(f, sizeof(int)+imax*sizeof(double), SEEK_SET);
// សរសេរអប្បបរមាជំនួសឱ្យធាតុឯកសារអតិបរមា
fwrite(&min, sizeof(ទ្វេ), 1, f);
// ផ្លាស់ទី ទ្រនិច ទៅ អប្បបរមា ធាតុ
fseek(f, sizeof(int)+imin*sizeof(double), SEEK_SET);
// កត់ត្រាអតិបរមាជំនួសឱ្យធាតុឯកសារអប្បបរមា
fwrite(&max, sizeof(ទ្វេ), 1, f);
// បិទឯកសារ
fclose(f);
// ដោះលែងការចងចាំ
លុប [ ] ក;
ប្រព័ន្ធ ("ផ្អាក");
ឯកសារអត្ថបទ
សូមក្រឡេកមើលការធ្វើការជាមួយឯកសារអត្ថបទនៅក្នុង C ដោយប្រើឧទាហរណ៍មួយ។ បង្កើតឯកសារអត្ថបទនៅលើដ្រាយ C ដែលមានឈ្មោះថា TextFile.txt ។ វាយបញ្ចូលបន្ទាត់ខាងក្រោមក្នុងឯកសារនេះ៖
String_1 123 String_11, 456
ខ្សែអក្សរ_២
ខ្សែអក្សរ_៣
រក្សាទុកឯកសារ។
ហើយនេះគឺជាកូដសម្រាប់កម្មវិធី C ដែលបើកឯកសាររបស់យើង ហើយអានបន្ទាត់ពីវា៖
/* *អ្នកនិពន្ធ៖ @author Subbotin B.P..h> #include
ដើម្បីបើកឯកសារអត្ថបទក្នុង C សូមប្រើមុខងារ fopen៖
ឯកសារ *pTextFile = fopen("C:\\TextFile.txt", "r");
អាគុយម៉ង់ទីមួយចំពោះមុខងារ fopen ចង្អុលទៅឯកសារមួយ ហើយទីពីរនិយាយថាឯកសារត្រូវបានបើកសម្រាប់អានពីវា។
យើងអានបន្ទាត់ដោយប្រើមុខងារ fgets៖
fgets(cArray, LEN, pTextFile);
អាគុយម៉ង់ទីមួយនៃមុខងារ fgets ចង្អុលទៅអារេតួអក្សរដែលខ្សែអក្សរដែលបានទទួលនឹងត្រូវបានរក្សាទុក អាគុយម៉ង់ទីពីរគឺជាចំនួនអតិបរមានៃតួអក្សរដែលត្រូវអាន ហើយទីបីគឺជាឯកសាររបស់យើង។
បន្ទាប់ពីបញ្ចប់ការធ្វើការជាមួយឯកសារ អ្នកត្រូវបិទវា៖
fclose(pTextFile);
យើងទទួលបាន:
អក្សររុស្ស៊ីក៏លេចឡើងនៅក្នុងបន្ទាត់។
និយាយអីញ្ចឹង ខ្ញុំបង្កើតកម្មវិធីនេះជា Eclipse។ អ្នកអាចមើលពីរបៀបធ្វើការជាមួយ C/C++ នៅក្នុង Eclipse ។
ដូច្នេះ យើងបើក និងអានទិន្នន័យពីឯកសារអត្ថបទ។
ឥឡូវនេះយើងនឹងរៀនពីរបៀបបង្កើតឯកសារអត្ថបទដោយកម្មវិធី និងសរសេរទិន្នន័យទៅវា។
/* អ្នកនិពន្ធ៖ @author Subbotin B.P..h> #include
បង្កើតឯកសារអត្ថបទដើម្បីសរសេរទិន្នន័យទៅ៖
ឯកសារ *pTextFile = fopen("C:\\TextFileW.txt", "w");
ប្រសិនបើឯកសារមានរួចហើយ វានឹងត្រូវបានបើក ហើយទិន្នន័យទាំងអស់ពីវានឹងត្រូវបានលុប។
cString អក្សរ C និងលេខ nVal ត្រូវបានសរសេរដោយកម្មវិធីទៅជាឯកសារអត្ថបទ។ cNewLine គឺគ្រាន់តែជាបន្ទាត់ថ្មី។
យើងសរសេរទិន្នន័យទៅឯកសារអត្ថបទដោយប្រើមុខងារ fprintf៖
fprintf(pTextFile, "%s%c", cString, cNewLine);
អាគុយម៉ង់ទីមួយនៅទីនេះគឺជាឯកសាររបស់យើង ទីពីរគឺជាខ្សែអក្សរទ្រង់ទ្រាយ ទីបីឬច្រើនគឺជាចំនួនអាគុយម៉ង់ដែលត្រូវការសម្រាប់ទម្រង់នេះ។
ស្លាក: ឯកសារអត្ថបទ, fopen, fclose, feof, setbuf, setvbuf, fflush, fgetc, fprintf, fscanf, fgets, buffed stream, unbuffered stream។
ធ្វើការជាមួយឯកសារអត្ថបទ
ការធ្វើការជាមួយឯកសារអត្ថបទគឺស្រដៀងនឹងការធ្វើការជាមួយកុងសូល៖ ដោយប្រើមុខងារបញ្ចូលដែលបានធ្វើទ្រង់ទ្រាយ យើងរក្សាទុកទិន្នន័យទៅក្នុងឯកសារ ដោយប្រើមុខងារលទ្ធផលដែលបានធ្វើទ្រង់ទ្រាយ យើងអានទិន្នន័យពីឯកសារមួយ។ មាន nuances ជាច្រើនដែលយើងនឹងមើលនៅពេលក្រោយ។ ប្រតិបត្តិការសំខាន់ៗដែលត្រូវធ្វើគឺ
- 1. បើកឯកសារដើម្បីឱ្យវាអាចចូលបាន។ ដូច្នោះហើយ អ្នកអាចបើកវាសម្រាប់អាន សរសេរ អាន និងសរសេរឡើងវិញ ឬសរសេរទៅចុងបញ្ចប់នៃឯកសារ។ល។ នៅពេលអ្នកបើកឯកសារ កំហុសជាច្រើនក៏អាចកើតឡើងផងដែរ - ឯកសារប្រហែលជាមិនមានទេ វាអាចជាប្រភេទឯកសារខុស អ្នកប្រហែលជាមិនមានការអនុញ្ញាតឱ្យធ្វើការជាមួយឯកសារ។ល។ ទាំងអស់នេះត្រូវតែយកទៅក្នុងគណនី។
- 2. ធ្វើការដោយផ្ទាល់ជាមួយឯកសារ - ការសរសេរនិងការអាន។ នៅទីនេះយើងក៏ត្រូវចងចាំផងដែរថាយើងមិនដំណើរការជាមួយអង្គចងចាំចូលដំណើរការដោយចៃដន្យទេ ប៉ុន្តែជាមួយនឹងស្ទ្រីមដែលជាប់គាំង ដែលបន្ថែមភាពជាក់លាក់របស់វាផ្ទាល់។
- 3. បិទឯកសារ។ ដោយសារឯកសារគឺជាធនធានខាងក្រៅរបស់កម្មវិធី ប្រសិនបើវាមិនត្រូវបានបិទ វានឹងបន្តព្យួរក្នុងអង្គចងចាំ សូម្បីតែបន្ទាប់ពីកម្មវិធីត្រូវបានបិទក៏ដោយ (ឧទាហរណ៍ វានឹងមិនអាចលុបឯកសារបើក ឬធ្វើការផ្លាស់ប្តូរបានទេ)។ ល។ ) លើសពីនេះទៀត ពេលខ្លះមិនចាំបាច់បិទ ប៉ុន្តែត្រូវ "បើកឡើងវិញ" ឯកសារតាមលំដាប់លំដោយ ឧទាហរណ៍ ដើម្បីប្តូររបៀបចូលប្រើ។
លើសពីនេះ មានកិច្ចការមួយចំនួនទៀត នៅពេលដែលយើងមិនចាំបាច់ចូលប្រើខ្លឹមសារនៃឯកសារ៖ ប្តូរឈ្មោះ ផ្លាស់ទី ចម្លង។ល។ ជាអកុសល ស្តង់ដារ C មិនមានការពិពណ៌នាអំពីមុខងារសម្រាប់តម្រូវការទាំងនេះទេ។ ជាការពិតណាស់ ពួកវាមានសម្រាប់ការអនុវត្តកម្មវិធីចងក្រងនីមួយៗ។ ការអានមាតិកានៃថតឯកសារ (ថត, ថត) ក៏កំពុងចូលប្រើឯកសារមួយដែរ ពីព្រោះថតឯកសារខ្លួនវាជាឯកសារដែលមានទ្រង់ទ្រាយមេតា។
ពេលខ្លះចាំបាច់ត្រូវអនុវត្តប្រតិបត្តិការជំនួយមួយចំនួន៖ ផ្លាស់ទីទៅទីតាំងដែលចង់បានក្នុងឯកសារ ចងចាំទីតាំងបច្ចុប្បន្ន កំណត់ប្រវែងឯកសារ។ល។
ដើម្បីធ្វើការជាមួយឯកសារ អ្នកត្រូវការវត្ថុ FILE ។ វត្ថុនេះរក្សាទុកឧបករណ៍កំណត់អត្តសញ្ញាណរបស់ស្ទ្រីមឯកសារ និងព័ត៌មានដែលត្រូវការដើម្បីគ្រប់គ្រងវា រួមទាំងទ្រនិចទៅសតិបណ្ដោះអាសន្នរបស់វា សូចនាករទីតាំងឯកសារ និងសូចនាករស្ថានភាព។
វត្ថុ FILE គឺជារចនាសម្ព័ន្ធដោយខ្លួនឯង ប៉ុន្តែវាលរបស់វាមិនគួរត្រូវបានចូលប្រើទេ។ កម្មវិធីចល័តត្រូវតែចាត់ទុកឯកសារជាវត្ថុអរូបីដែលអនុញ្ញាតឱ្យចូលប្រើការស្ទ្រីមឯកសារ។
ការបង្កើត និងការបែងចែកអង្គចងចាំសម្រាប់វត្ថុនៃប្រភេទ FILE ត្រូវបានអនុវត្តដោយប្រើមុខងារ fopen ឬ tmpfile (មានផ្សេងទៀត ប៉ុន្តែយើងនឹងផ្តោតលើចំណុចទាំងនេះប៉ុណ្ណោះ)។
មុខងារ fopen បើកឯកសារ។ វាទទួលបានអាគុយម៉ង់ពីរ - ខ្សែអក្សរដែលមានអាសយដ្ឋានឯកសារ និងខ្សែអក្សរដែលមានរបៀបចូលប្រើឯកសារ។ ឈ្មោះឯកសារអាចជាដាច់ខាត ឬទាក់ទង។ fopen ត្រឡប់ទ្រនិចទៅវត្ថុ FILE ដែលអាចត្រូវបានប្រើដើម្បីចូលប្រើឯកសារបន្ថែម។
ឯកសារ * fopen (ឈ្មោះឯកសារ const char * របៀប const char *);
ជាឧទាហរណ៍ សូមបើកឯកសារមួយ ហើយសរសេរ Hello World ទៅក្នុងវា។
# រួមបញ្ចូល
មុខងារ fopen ខ្លួនវាបែងចែកអង្គចងចាំសម្រាប់ការសម្អាតវត្ថុត្រូវបានអនុវត្តដោយមុខងារ fclose ។ វាចាំបាច់ក្នុងការបិទឯកសារ; វានឹងមិនបិទដោយខ្លួនឯងទេ។
មុខងារ fopen អាចបើកឯកសារក្នុងទម្រង់អត្ថបទ ឬប្រព័ន្ធគោលពីរ។ លំនាំដើមគឺអត្ថបទ។ របៀបចូលប្រើអាចមានដូចខាងក្រោម
ប្រភេទ | ការពិពណ៌នា |
---|---|
r | ការអាន។ ឯកសារត្រូវតែមាន។ |
វ | សរសេរឯកសារថ្មី។ ប្រសិនបើឯកសារដែលមានឈ្មោះដូចគ្នាមានរួចហើយ មាតិការបស់វានឹងត្រូវបាត់បង់។ |
ក | សរសេរទៅចុងបញ្ចប់នៃឯកសារ។ ប្រតិបត្តិការកំណត់ទីតាំង (fseek, fsetpos, frewind) មិនត្រូវបានអើពើ។ ឯកសារត្រូវបានបង្កើតប្រសិនបើវាមិនមាន។ |
r+ | ការអាននិងការធ្វើបច្ចុប្បន្នភាព។ អ្នកអាចអាននិងសរសេរបាន។ ឯកសារត្រូវតែមាន។ |
w+ | ការថតនិងធ្វើបច្ចុប្បន្នភាព។ ឯកសារថ្មីមួយត្រូវបានបង្កើត។ ប្រសិនបើឯកសារដែលមានឈ្មោះដូចគ្នាមានរួចហើយ មាតិការបស់វានឹងត្រូវបាត់បង់។ អ្នកអាចទាំងសរសេរ និងអាន។ |
ក+ | បញ្ចប់ការបង្ហោះ និងធ្វើបច្ចុប្បន្នភាព។ ប្រតិបត្តិការកំណត់ទីតាំងគឺបានតែអានហើយមិនអើពើសម្រាប់ការសរសេរ។ ប្រសិនបើឯកសារមិនមានទេ ឯកសារថ្មីមួយនឹងត្រូវបានបង្កើត។ |
ប្រសិនបើចាំបាច់ត្រូវបើកឯកសារក្នុងរបៀបគោលពីរ នោះអក្សរ b ត្រូវបានបន្ថែមទៅចុងបន្ទាត់ ឧទាហរណ៍ “rb”, “wb”, “ab” ឬសម្រាប់របៀបចម្រុះ “ab+”, “ wb+”, “ab+”។ ជំនួសឱ្យ b អ្នកអាចបន្ថែមអក្សរ t បន្ទាប់មកឯកសារនឹងបើកក្នុងរបៀបអត្ថបទ។ វាអាស្រ័យលើការអនុវត្ត។ នៅក្នុងស្តង់ដារ C ថ្មី (2011) អក្សរ x មានន័យថា fopen គួរតែបរាជ័យប្រសិនបើឯកសារមានរួចហើយ។ ចូរបំពេញបន្ថែមកម្មវិធីចាស់របស់យើង៖ បើកឯកសារឡើងវិញ ហើយពិចារណាពីអ្វីដែលយើងបានសរសេរនៅទីនោះ។
# រួមបញ្ចូល
ជំនួសឱ្យមុខងារ fgets អ្នកអាចប្រើ fscanf ប៉ុន្តែអ្នកត្រូវចាំថាវាអាចអានបានត្រឹមតែចន្លោះដំបូងប៉ុណ្ណោះ។
fscanf(ឯកសារ, "%127s", សតិបណ្ដោះអាសន្ន);
ដូចគ្នានេះផងដែរជំនួសឱ្យការបើកនិងបិទឯកសារអ្នកអាចប្រើមុខងារ freopen ដែល "បើកឡើងវិញ" ឯកសារជាមួយនឹងសិទ្ធិចូលប្រើថ្មី។
# រួមបញ្ចូល
មុខងារ fprintf និង fscanf ខុសពី printf និង scanf តែនៅក្នុងនោះពួកគេយកជាអាគុយម៉ង់ដំបូងរបស់ពួកគេនូវទ្រនិចទៅឯកសារដែលពួកគេនឹងបញ្ចេញ ឬពីអ្វីដែលពួកគេនឹងអានទិន្នន័យ។ វាមានតម្លៃបន្ថែមភ្លាមៗថាមុខងារ printf និង scanf អាចត្រូវបានជំនួសយ៉ាងងាយស្រួលដោយមុខងារ fprintf និង fscanf ។ នៅក្នុងប្រព័ន្ធប្រតិបត្តិការ (យើងកំពុងពិចារណាលើប្រព័ន្ធប្រតិបត្តិការធម្មតាបំផុត និងគ្រប់គ្រាន់) មានស្ទ្រីមស្តង់ដារចំនួនបី៖ ស្ទ្រីមទិន្នផលស្តង់ដារ stdout ស្ទ្រីមបញ្ចូលស្តង់ដារ stdin និងស្ទ្រីមលទ្ធផលកំហុសស្តង់ដារ stderr ។ ពួកវាត្រូវបានបើកដោយស្វ័យប្រវត្តិនៅពេលដែលកម្មវិធីត្រូវបានបើកដំណើរការ ហើយត្រូវបានភ្ជាប់ជាមួយកុងសូល។ ឧទាហរណ៍
# រួមបញ្ចូល
កំហុសក្នុងការបើកឯកសារ
ប្រសិនបើការហៅមុខងារ fopen បរាជ័យ វានឹងត្រឡប់ NULL វិញ។ កំហុសនៅពេលធ្វើការជាមួយឯកសារកើតឡើងជាញឹកញាប់ ដូច្នេះរាល់ពេលដែលយើងបើកឯកសារ យើងត្រូវពិនិត្យមើលលទ្ធផលការងារ
# រួមបញ្ចូល
បញ្ហាកើតឡើងនៅពេលដែលឯកសារជាច្រើនត្រូវបានបើកក្នុងពេលតែមួយ៖ ប្រសិនបើមួយក្នុងចំណោមពួកវាមិនអាចបើកបានទេនោះឯកសារដែលនៅសល់ក៏ត្រូវបិទផងដែរ។
ឯកសារ *inputFile, *outputFile; មិនបានចុះហត្ថលេខា m, n; មិនបានចុះហត្ថលេខា i, j; inputFile = fopen(INPUT_FILE, READ_ONLY); ប្រសិនបើ (inputFile == NULL) ( printf("កំហុសក្នុងការបើកឯកសារ %s", INPUT_FILE); getch(); exit(3); ) outputFile = fopen(OUTPUT_FILE, WRITE_ONLY); if (outputFile == NULL) ( printf("កំហុសក្នុងការបើកឯកសារ %s", OUTPUT_FILE); getch(); if (inputFile != NULL) ( fclose(inputFile); ) exit(4); ) ...
ក្នុងករណីសាមញ្ញ អ្នកអាចធ្វើជាប្រធានដូចក្នុងលេខកូដមុន។ ក្នុងករណីដែលស្មុគ្រស្មាញជាងនេះ វិធីសាស្ត្រត្រូវបានប្រើដែលជំនួស RAII ពី C ++: wrappers ឬ compiler features (cleanup in GCC) ជាដើម។
ការផ្ទុកទិន្នន័យ
ដូចដែលបានរៀបរាប់ខាងលើ នៅពេលដែលយើងបញ្ចេញទិន្នន័យ វាត្រូវបានដាក់ដំបូងនៅក្នុងសតិបណ្ដោះអាសន្ន។ សតិបណ្ដោះអាសន្នត្រូវបានសម្អាត
- 1) ប្រសិនបើវាពេញ
- 2) ប្រសិនបើស្ទ្រីមត្រូវបានបិទ
- 3) ប្រសិនបើយើងបង្ហាញយ៉ាងច្បាស់ថាវាចាំបាច់ដើម្បីជម្រះសតិបណ្ដោះអាសន្ន (មានករណីលើកលែងនៅទីនេះផងដែរ :)) ។
- 4) ជម្រះផងដែរប្រសិនបើកម្មវិធីបានបញ្ចប់ដោយជោគជ័យ។ ក្នុងពេលជាមួយគ្នានោះឯកសារទាំងអស់ត្រូវបានបិទ។ ក្នុងករណីមានកំហុសពេលរត់ វាប្រហែលជាមិនកើតឡើងទេ។
អ្នកអាចបង្ខំមិនផ្ទុកសតិបណ្ដោះអាសន្នដោយហៅមុខងារ fflush(File *)។ សូមក្រឡេកមើលឧទាហរណ៍ពីរ - ដោយមាននិងគ្មានការសម្អាត។
# រួមបញ្ចូល
មិនបញ្ចេញមតិលើការហៅចេញ។ នៅពេលដំណើរការ សូមបើកឯកសារអត្ថបទ ហើយមើលឥរិយាបថ។
អ្នកអាចកំណត់បណ្តុំឯកសារដោយខ្លួនឯងដោយកំណត់ទំហំផ្ទាល់ខ្លួនរបស់អ្នក។ នេះត្រូវបានធ្វើដោយប្រើមុខងារ
Setbuf (ឯកសារ * ស្ទ្រីម, char * buffer);
ដែលយកឯកសារដែលបានបើករួចហើយ និងទ្រនិចទៅសតិបណ្ដោះអាសន្នថ្មី។ ទំហំនៃបណ្តុំថ្មីត្រូវតែមិនតិចជាង BUFSIZ (ឧទាហរណ៍នៅលើស្ថានីយការងារបច្ចុប្បន្ន BUFSIZ គឺ 512 បៃ)។ ប្រសិនបើអ្នកឆ្លងកាត់ NULL ជាបណ្ដោះអាសន្ន នោះស្ទ្រីមនឹងមិនមានសតិបណ្ដោះអាសន្នទេ។ អ្នកក៏អាចប្រើមុខងារបានដែរ។
Int setvbuf(FILE * stream, char * buffer, int mode, size_t size);
ដែលទទួលយកបណ្តុំនៃទំហំទំហំបំពាន។ របៀបអាចយកតម្លៃដូចខាងក្រោម
- _IOFBF- ផ្ទុកពេញ។ ទិន្នន័យត្រូវបានសរសេរទៅឯកសារនៅពេលវាពេញ។ នៅពេលអាន សតិបណ្ដោះអាសន្នត្រូវបានចាត់ទុកថាពេញ នៅពេលដែលប្រតិបត្តិការបញ្ចូលត្រូវបានស្នើសុំ ហើយសតិបណ្ដោះអាសន្នគឺទទេ។
- _IOLBF- សតិបណ្ដោះអាសន្នលីនេអ៊ែរ។ ទិន្នន័យត្រូវបានសរសេរទៅឯកសារនៅពេលដែលវាពេញឬពេលដែលមានតួអក្សរបន្ទាត់ថ្មី។ នៅពេលអាន សតិបណ្ដោះអាសន្នត្រូវបានបំពេញទៅតួអក្សរបន្ទាត់ថ្មី នៅពេលដែលប្រតិបត្តិការបញ្ចូលត្រូវបានស្នើសុំ ហើយសតិបណ្ដោះអាសន្នគឺទទេ។
- _IONBF- គ្មានការផ្អាក។ ក្នុងករណីនេះ ទំហំ និងប៉ារ៉ាម៉ែត្រសតិបណ្ដោះអាសន្នមិនត្រូវបានអើពើ។
ឧទាហរណ៍៖ ចូរយើងកំណត់សតិបណ្ដោះអាសន្នរបស់យើង ហើយមើលពីរបៀបដែលការអានឯកសារត្រូវបានអនុវត្ត។ សូមឱ្យឯកសារខ្លី (អ្វីមួយដូចជា Hello, World!) ហើយយើងអានវាតាមតួអក្សរ
# រួមបញ្ចូល
វាអាចត្រូវបានគេមើលឃើញថាទិន្នន័យមានរួចហើយនៅក្នុងសតិបណ្ដោះអាសន្ន។ ការអានតួអក្សរតាមតួអក្សរត្រូវបានធ្វើពីសតិបណ្ដោះអាសន្ន។
feof
មុខងារ int feof (ឯកសារ * ស្ទ្រីម); ត្រឡប់ពិតប្រសិនបើចុងបញ្ចប់នៃឯកសារត្រូវបានឈានដល់។ មុខងារនេះងាយស្រួលប្រើនៅពេលដែលអ្នកត្រូវឆ្លងកាត់ឯកសារទាំងមូលពីដើមដល់ចប់។ សូមឱ្យមានឯកសារដែលមានមាតិកាអត្ថបទ text.txt ។ យើងអានឯកសារតាមតួអក្សរ ហើយបង្ហាញវានៅលើអេក្រង់។
# រួមបញ្ចូល
អ្វីគ្រប់យ៉ាងនឹងល្អ ប៉ុន្តែមុខងារ feof មិនដំណើរការត្រឹមត្រូវ... នេះគឺដោយសារតែការពិតដែលថាគំនិតនៃ "ចុងបញ្ចប់នៃឯកសារ" មិនត្រូវបានកំណត់។ កំហុសដែលជារឿយៗកើតឡើងនៅពេលប្រើ feof គឺថាទិន្នន័យចុងក្រោយដែលបានអានត្រូវបានបោះពុម្ពពីរដង។ នេះគឺដោយសារតែការពិតដែលថាទិន្នន័យត្រូវបានសរសេរទៅសតិបណ្ដោះអាសន្នបញ្ចូល ការអានចុងក្រោយកើតឡើងដោយមានកំហុស ហើយមុខងារត្រឡប់តម្លៃចាស់ដែលបានអាន។
# រួមបញ្ចូល
ឧទាហរណ៍នេះនឹងបរាជ័យ (ភាគច្រើនទំនងជា) ហើយបោះពុម្ពតួអក្សរចុងក្រោយនៃឯកសារពីរដង។
ដំណោះស្រាយគឺមិនត្រូវប្រើ feof ទេ។ ឧទាហរណ៍ រក្សាទុកចំនួនសរុបនៃកំណត់ត្រា ឬប្រើការពិតដែលថាមុខងារ fscanf ។ល។ ជាធម្មតាត្រឡប់ចំនួនតម្លៃដែលបានអាន និងត្រូវគ្នាយ៉ាងត្រឹមត្រូវ។
# រួមបញ្ចូល
ឧទាហរណ៍
1. ឯកសារមួយមានលេខពីរ - វិមាត្រនៃអារេ។ ចូរបំពេញឯកសារទីពីរដោយអារេនៃលេខចៃដន្យ។
# រួមបញ្ចូល
2. អ្នកប្រើប្រាស់ចម្លងឯកសារ ហើយជ្រើសរើសរបៀបប្រតិបត្តិការជាមុនសិន៖ ឯកសារអាចត្រូវបានបញ្ចេញទៅកុងសូល ឬចម្លងទៅឯកសារថ្មី។
# រួមបញ្ចូល
3. អ្នកប្រើប្រាស់បញ្ចូលទិន្នន័យពីកុងសូល ហើយវាត្រូវបានសរសេរទៅឯកសារមួយរហូតដល់គ្រាប់ចុច esc ត្រូវបានចុច។ ពិនិត្យមើលកម្មវិធីហើយមើល។ របៀបដែលវាមានឥរិយាបទប្រសិនបើអ្នកបញ្ចូល backspace: អ្វីដែលជាលទ្ធផលទៅឯកសារ និងអ្វីដែលជាលទ្ធផលទៅកុងសូល។
# រួមបញ្ចូល
4. ឯកសារមានចំនួនគត់។ ស្វែងរកអតិបរមានៃពួកគេ។ ចូរយើងទាញយកប្រយោជន៍ពីការពិតដែលថាមុខងារ fscanf ត្រឡប់ចំនួននៃវត្ថុដែលបានអាន និងផ្គូផ្គងត្រឹមត្រូវ។ លេខ 1 គួរតែត្រលប់មកវិញរាល់ពេល។
# រួមបញ្ចូល
ដំណោះស្រាយមួយទៀតគឺត្រូវអានលេខរហូតដល់ចប់ឯកសារ។
# រួមបញ្ចូល
5. ឯកសារមានពាក្យ៖ ពាក្យរុស្ស៊ី តារាងពាក្យ អង់គ្លេស ក្នុងជួរជាច្រើន។ អ្នកប្រើបញ្ចូលពាក្យជាភាសាអង់គ្លេស, វាជាការចាំបាច់ដើម្បីចេញជាភាសារុស្ស៊ី។
ឯកសារបកប្រែមើលទៅដូចនេះ
ព្រះអាទិត្យព្រះអាទិត្យ
ខ្មៅដៃ
ខ្មៅដៃប៊ិចប៊ិច
ទ្វារទ្វារ
បង្អួចបង្អួច
កៅអីកៅអី
កៅអី
និងរក្សាទុកនៅក្នុងការអ៊ិនកូដ cp866 (OEM 866) ។ វាសំខាន់ណាស់៖ ពាក្យគូចុងក្រោយក៏បញ្ចប់ដោយបន្ទាត់។
ក្បួនដោះស្រាយមានដូចខាងក្រោម៖ យើងអានបន្ទាត់ពីឯកសារ ស្វែងរកតួអក្សរផ្ទាំងក្នុងបន្ទាត់ ជំនួសតួអក្សរផ្ទាំងដោយលេខសូន្យ ចម្លងពាក្យរុស្ស៊ីពីសតិបណ្ដោះអាសន្ន ចម្លងពាក្យអង់គ្លេសពីសតិបណ្ដោះអាសន្ន ពិនិត្យមើលសមភាព។
# រួមបញ្ចូល
6. រាប់ចំនួនបន្ទាត់ក្នុងឯកសារ។ យើងនឹងអានតួអក្សរឯកសារតាមតួអក្សរ ដោយរាប់ចំនួនតួអក្សរ "\n" រហូតដល់យើងជួបតួអក្សរ EOF ។ EOF គឺជាតួអក្សរពិសេសដែលបង្ហាញថាការបញ្ចូលបានបញ្ចប់ ហើយមិនមានទិន្នន័យដែលត្រូវអានទៀតទេ។ អនុគមន៍ត្រឡប់តម្លៃអវិជ្ជមានក្នុងករណីមានកំហុស។
ចំណាំ៖ EOF គឺជាប្រភេទ int ដូច្នេះអ្នកត្រូវប្រើ int ដើម្បីអានតួអក្សរ។ លើសពីនេះទៀតតម្លៃនៃ EOF មិនត្រូវបានកំណត់ដោយស្តង់ដារទេ។
#កំណត់ _CRT_SECURE_NO_WARNINGS #រួមបញ្ចូល
Ru-Cyrl 18- ការបង្រៀន Sypachev S.S. ១៩៨៩-០៤-១៤ [អ៊ីមែលការពារ]លោក Stepan Sypachevសិស្ស
នៅតែមិនច្បាស់? - សរសេរសំណួរទៅប្រអប់សំបុត្រ
មុខងារ fopen() បើកស្ទ្រីមសម្រាប់ប្រើ ភ្ជាប់ឯកសារជាមួយស្ទ្រីមនោះ ហើយបន្ទាប់មកត្រឡប់ទ្រនិច FILE ទៅស្ទ្រីមនោះ។ ភាគច្រើនជាញឹកញាប់ឯកសារត្រូវបានចាត់ទុកជាឯកសារឌីស។ មុខងារ fopen() មានគំរូដូចខាងក្រោម៖
ឯកសារ *fopen(const char *filename, const char *mode);
កន្លែងដែលរបៀបចង្អុលទៅខ្សែអក្សរដែលមានរបៀបដែលចង់បានសម្រាប់បើកឯកសារ។ តម្លៃត្រឹមត្រូវសម្រាប់របៀបក្នុង Borland C++ ត្រូវបានបង្ហាញក្នុងតារាង។ ឈ្មោះឯកសារត្រូវតែជាខ្សែអក្សរដែលផ្តល់ឈ្មោះឯកសារត្រឹមត្រូវដល់ប្រព័ន្ធប្រតិបត្តិការ ហើយអាចមានឈ្មោះផ្លូវ។
មុខងារ fopen() ត្រឡប់ទ្រនិចទៅប្រភេទមូលដ្ឋាន FILE ។ ទ្រនិចនេះកំណត់អត្តសញ្ញាណឯកសារ និងត្រូវបានប្រើប្រាស់ដោយមុខងារប្រព័ន្ធឯកសារភាគច្រើន។ អ្នកមិនគួរផ្លាស់ប្តូរវាដោយខ្លួនឯងទេ។ អនុគមន៍ត្រឡប់ទ្រនិចទទេ ប្រសិនបើឯកសារមិនអាចបើកបាន។
ដូចដែលតារាងបង្ហាញ ឯកសារអាចត្រូវបានបើកជាអត្ថបទ ឬរបៀបប្រព័ន្ធគោលពីរ។ នៅក្នុងទម្រង់អត្ថបទ ដូចដែលអ្នកវាយបញ្ចូល លំដាប់នៃការបញ្ជូនត្រឡប់មកវិញ និងព័ត៌មានបន្ទាត់ត្រូវបានបកប្រែទៅជាតួអក្សរបន្ទាត់ថ្មី។ នៅក្នុងលទ្ធផល ភាពផ្ទុយគ្នាគឺជាការពិត៖ តួអក្សរបន្ទាត់ថ្មីត្រូវបានបកប្រែទៅជាការបញ្ជូនត្រឡប់មកវិញ និងព័ត៌មានបន្ទាត់។ ការបកប្រែនេះមិនកើតឡើងនៅក្នុងឯកសារគោលពីរទេ។ នៅពេលដែលទាំង t ឬ b មិនត្រូវបានបញ្ជាក់នៅក្នុងអាគុយម៉ង់របៀប នោះស្ថានភាពអត្ថបទ/ប្រព័ន្ធគោលពីររបស់ឯកសារត្រូវបានកំណត់ដោយតម្លៃនៃអថេរសកល _fmode ដែលបានកំណត់នៅក្នុង Borland C++ ។ តាមលំនាំដើម fmode ត្រូវបានកំណត់ទៅ O_TEXT នោះគឺ របៀបអត្ថបទត្រូវបានកំណត់។ ប្រសិនបើអ្នកកំណត់ _fmode ទៅ O_BINARY នោះឯកសារនឹងត្រូវបានបើកក្នុងរបៀបគោលពីរ។ (ម៉ាក្រូទាំងនេះត្រូវបានកំណត់ក្នុង fcntl.h.) តាមធម្មជាតិ ការប្រើ t ឬ b ច្បាស់លាស់លុបបំបាត់ផលប៉ះពាល់ដែលទាក់ទងនឹងអថេរ _fmode ។ លើសពីនេះទៀត _fmode គឺជាក់លាក់ចំពោះផលិតផល Borland ប៉ុណ្ណោះ។ វាមិនត្រូវបានកំណត់នៅក្នុងប្រព័ន្ធ ANSI C I/O ទេ។
ប្រសិនបើអ្នកត្រូវការបើកឯកសារដែលមានឈ្មោះតេស្តសម្រាប់ការសរសេរ អ្នកគួរតែសរសេរ៖
Fp = fopen("សាកល្បង", "w");
ដែល fp គឺជាអថេរនៃប្រភេទ FILE * ។ ទោះយ៉ាងណាក៏ដោយ វាជារឿងធម្មតាដែលឃើញដូចខាងក្រោម៖
ប្រសិនបើ((fp = fopen("test", "w"))==NULL) (
puts("មិនអាចបើកឯកសារ។");
ច្រកចេញ (1);
}
វិធីសាស្រ្តនេះអនុញ្ញាតឱ្យអ្នករកឃើញកំហុសនៅពេលបើកឯកសារឧទាហរណ៍វត្តមាននៃការការពារការសរសេរឬកង្វះទំហំទំនេរនៅលើថាស។
ប្រសិនបើ fopen() ត្រូវបានប្រើដើម្បីបើកឯកសារសម្រាប់ការសរសេរ នោះឯកសារដែលមានពីមុនដែលមានឈ្មោះជាក់លាក់នឹងត្រូវបានលុប។ ប្រសិនបើឯកសារដែលមានឈ្មោះដែលបានបញ្ជាក់មិនមានទេ វានឹងត្រូវបានបង្កើត។
ប្រសិនបើអ្នកត្រូវការបន្ថែមព័ត៌មានទៅចុងបញ្ចប់នៃឯកសារ អ្នកគួរតែប្រើរបៀប a (បន្ថែម)។ ប្រសិនបើឯកសារមិនមានទេនោះវានឹងត្រូវបានបង្កើត។
ការបើកឯកសារសម្រាប់ការអានតម្រូវឱ្យមានវត្តមាននៃឯកសារ។ ប្រសិនបើឯកសារមិនមានទេ កំហុសមួយនឹងត្រូវបានត្រឡប់។ ប្រសិនបើឯកសារត្រូវបានបើកសម្រាប់ប្រតិបត្តិការអាន/សរសេរ នោះវាមិនត្រូវបានលុបទេប្រសិនបើវាមាន ហើយប្រសិនបើឯកសារមិនមាន នោះវាត្រូវបានបង្កើត។
អត្ថន័យ |
|
---|---|
បើកឯកសារសម្រាប់អាន។ (បើកតាមលំនាំដើមជាឯកសារអត្ថបទ។ ) |
|
បង្កើតឯកសារដើម្បីសរសេរទៅ។ (បើកតាមលំនាំដើមជាឯកសារអត្ថបទ។ ) |
|
ភ្ជាប់ទៅឯកសារមួយ។ (បើកតាមលំនាំដើមជាឯកសារអត្ថបទ។ ) |
|
បើកឯកសារគោលពីរសម្រាប់អាន។ |
|
បើកឯកសារគោលពីរសម្រាប់ការសរសេរ។ |
|
ភ្ជាប់ទៅឯកសារគោលពីរ។ |
|
បើកឯកសារសម្រាប់អាន/សរសេរ។ (បើកតាមលំនាំដើមជាឯកសារអត្ថបទ។ ) |
|
បង្កើតឯកសារអាន/សរសេរ។ (បើកតាមលំនាំដើមជាឯកសារអត្ថបទ។ ) |
|
ភ្ជាប់ ឬបង្កើតឯកសារអាន/សរសេរ។ (បើកតាមលំនាំដើមជាឯកសារអត្ថបទ។ ) |
|
បើកឯកសារគោលពីរសម្រាប់អាន/សរសេរ។ |
|
បង្កើតឯកសារប្រព័ន្ធគោលពីរ អាន/សរសេរ។ |
|
ភ្ជាប់ ឬបង្កើតឯកសារគោលពីរ អាន/សរសេរ។ |
|
បង្កើតឯកសារអត្ថបទសម្រាប់សរសេរ។ |
|
ភ្ជាប់ទៅឯកសារអត្ថបទ។ |
|
បើកឯកសារអត្ថបទសម្រាប់អាន។ |
|
បង្កើតឯកសារអត្ថបទសម្រាប់អាន/សរសេរ។ |
|
បើក ឬបង្កើតឯកសារអត្ថបទសម្រាប់អាន/សរសេរ។ |
ដើម្បីភាពងាយស្រួល ព័ត៌មាននៅក្នុងឧបករណ៍ផ្ទុកត្រូវបានរក្សាទុកក្នុងទម្រង់ជាឯកសារ។
ឯកសារគឺជាតំបន់ដែលមានឈ្មោះនៃអង្គចងចាំខាងក្រៅដែលបានបម្រុងទុកសម្រាប់រក្សាទុកអារេនៃទិន្នន័យ។ ទិន្នន័យដែលមាននៅក្នុងឯកសារមានលក្ខណៈចម្រុះណាស់៖ កម្មវិធីក្នុងក្បួនដោះស្រាយ ឬភាសាម៉ាស៊ីន។ ទិន្នន័យដំបូងសម្រាប់ប្រតិបត្តិការកម្មវិធី ឬលទ្ធផលនៃការអនុវត្តកម្មវិធី; អត្ថបទឥតគិតថ្លៃ; រូបភាពក្រាហ្វិកជាដើម។
ថតឯកសារ (ថតឯកសារ) - បណ្តុំនៃបៃដែលមានឈ្មោះនៅលើឧបករណ៍ផ្ទុកដែលមានឈ្មោះនៃថតរង និងឯកសារ ដែលប្រើក្នុងប្រព័ន្ធឯកសារ ដើម្បីសម្រួលដល់ការរៀបចំឯកសារ។
ប្រព័ន្ធឯកសារហៅថាផ្នែកមុខងារនៃប្រព័ន្ធប្រតិបត្តិការដែលធ្វើប្រតិបត្តិការលើឯកសារ។ ឧទាហរណ៍នៃប្រព័ន្ធឯកសារគឺ FAT (FAT - តារាងបែងចែកឯកសារ), NTFS, UDF (ប្រើនៅលើស៊ីឌី) ។
មានកំណែសំខាន់ៗចំនួនបីនៃ FAT គឺ FAT12 FAT16 និង FAT32 ។ ពួកវាខុសគ្នានៅក្នុងជម្រៅប៊ីតនៃកំណត់ត្រានៅក្នុងរចនាសម្ព័ន្ធថាស ពោលគឺឧ។ ចំនួនប៊ីតដែលបានបែងចែកដើម្បីរក្សាទុកលេខចង្កោម។ FAT12 ត្រូវបានប្រើជាចម្បងសម្រាប់ថាសទន់ (រហូតដល់ 4 KB) FAT16 - សម្រាប់ថាសដែលមានសមត្ថភាពតូច FAT32 - សម្រាប់ដ្រាយ FLASH ដែលមានសមត្ថភាពខ្ពស់ (រហូតដល់ 32 GB) ។
សូមក្រឡេកមើលរចនាសម្ព័ន្ធនៃប្រព័ន្ធឯកសារដោយប្រើ FAT32 ជាឧទាហរណ៍។
រចនាសម្ព័ន្ធឯកសារ FAT32
ឧបករណ៍អង្គចងចាំខាងក្រៅនៅក្នុងប្រព័ន្ធ FAT32 មានអាសយដ្ឋានប្លុកជាជាងអាសយដ្ឋានបៃ។ ព័ត៌មានត្រូវបានសរសេរទៅឧបករណ៍អង្គចងចាំខាងក្រៅនៅក្នុងប្លុក ឬផ្នែក។
វិស័យគឺជាអង្គភាពផ្ទុកព័ត៌មានដែលអាចអាសយដ្ឋានបានអប្បបរមានៅលើឧបករណ៍ផ្ទុកខាងក្រៅ។ ជាធម្មតា ទំហំផ្នែកត្រូវបានជួសជុលនៅ 512 បៃ។ ដើម្បីបង្កើនទំហំអាសយដ្ឋាននៃឧបករណ៍អង្គចងចាំខាងក្រៅ វិស័យត្រូវបានបញ្ចូលគ្នាជាក្រុមដែលហៅថាចង្កោម។
ចង្កោមគឺជាសហជីពនៃវិស័យជាច្រើន ដែលអាចចាត់ទុកថាជាអង្គភាពឯករាជ្យដែលមានលក្ខណៈសម្បត្តិជាក់លាក់។ ទ្រព្យសម្បត្តិសំខាន់នៃចង្កោមគឺទំហំរបស់វា វាស់ជាចំនួនផ្នែក ឬចំនួនបៃ។
ប្រព័ន្ធឯកសារ FAT32 មានរចនាសម្ព័ន្ធដូចខាងក្រោម។
ចង្កោមដែលប្រើសម្រាប់ការសរសេរឯកសារត្រូវបានដាក់លេខដោយចាប់ផ្តើមពីលេខ 2។ តាមក្បួន ចង្កោមលេខ 2 ត្រូវបានប្រើដោយថតឫស ហើយចាប់ផ្តើមពីចង្កោមលេខ 3 អារេទិន្នន័យត្រូវបានរក្សាទុក។ វិស័យដែលប្រើដើម្បីរក្សាទុកព័ត៌មាននៅខាងលើថតឫសមិនត្រូវបានចង្កោមទេ។
ទំហំឯកសារអប្បបរមាដែលត្រូវការនៅលើថាសត្រូវគ្នានឹង 1 ចង្កោម។
ផ្នែកចាប់ផ្ដើមចាប់ផ្តើមដោយព័ត៌មានខាងក្រោម៖
- EB 58 90 - លោតដោយគ្មានលក្ខខណ្ឌ និងហត្ថលេខា;
- 4D 53 44 4F 53 35 2E 30 MSDOS5.0;
- 00 02 - ចំនួនបៃក្នុងវិស័យ (ជាធម្មតា 512);
- 1 បៃ - ចំនួននៃផ្នែកនៅក្នុងចង្កោម;
- 2 បៃ - ចំនួននៃផ្នែកបម្រុង។
លើសពីនេះ ផ្នែកចាប់ផ្ដើមមានព័ត៌មានសំខាន់ៗដូចខាងក្រោម៖
- 0x10 (1 បៃ) - ចំនួនតារាង FAT (ជាធម្មតា 2);
- 0x20 (4 បៃ) - ចំនួននៃផ្នែកនៅលើថាស;
- 0x2С (4 បៃ) - ចំនួនចង្កោមនៃថតឫស;
- 0x47 (11 បៃ) - ស្លាកកម្រិតសំឡេង;
- 0x1FE (2 បៃ) - ហត្ថលេខាផ្នែកចាប់ផ្ដើម (55 AA) ។
ផ្នែកព័ត៌មានប្រព័ន្ធឯកសារមាន៖
- 0x00 (4 បៃ) - ហត្ថលេខា (52 52 61 41);
- 0x1E4 (4 បៃ) - ហត្ថលេខា (72 72 41 61);
- 0x1E8 (4 បៃ) - ចំនួននៃចង្កោមឥតគិតថ្លៃ, -1 ប្រសិនបើមិនស្គាល់;
- 0x1EC (4 បៃ) - ចំនួននៃចង្កោមដែលបានកត់ត្រាចុងក្រោយ;
- 0x1FE (2 បៃ) - ហត្ថលេខា (55 AA) ។
តារាង FAT មានព័ត៌មានអំពីស្ថានភាពនៃចង្កោមនីមួយៗនៅលើថាស។ 2 បៃទាបនៃតារាង FAT រក្សាទុក F8 FF FF 0F FF FF FF FF FF (ដែលត្រូវនឹងស្ថានភាពនៃចង្កោម 0 និង 1 ដែលអវត្តមានរាងកាយ) ។ បន្ទាប់មក ស្ថានភាពនៃចង្កោមនីមួយៗមានចំនួននៃចង្កោមដែលឯកសារបច្ចុប្បន្នបន្ត ឬព័ត៌មានខាងក្រោម៖
- 00 00 00 00 - ចង្កោមគឺឥតគិតថ្លៃ;
- FF FF FF 0F - ចុងបញ្ចប់នៃឯកសារបច្ចុប្បន្ន។
- 8 បៃ - ឈ្មោះឯកសារ;
- 3 បៃ - ផ្នែកបន្ថែមឯកសារ;
ថត root មានសំណុំនៃកំណត់ត្រាព័ត៌មាន 32 ប៊ីតអំពីឯកសារនីមួយៗដែលមានព័ត៌មានដូចខាងក្រោមៈ
![](https://i1.wp.com/prog-cpp.ru/wp-content/uploads/2014/12/fileattr1-1.png)
នៅពេលធ្វើការជាមួយឈ្មោះឯកសារវែង (រួមទាំងឈ្មោះរុស្ស៊ី) ឈ្មោះឯកសារត្រូវបានអ៊ិនកូដដោយប្រើប្រព័ន្ធអ៊ិនកូដ UTF-16 ។ ក្នុងករណីនេះ 2 បៃត្រូវបានបម្រុងទុកសម្រាប់ការអ៊ិនកូដតួអក្សរនីមួយៗ។ ក្នុងករណីនេះ ឈ្មោះឯកសារត្រូវបានសរសេរក្នុងរចនាសម្ព័ន្ធដូចខាងក្រោមៈ
- 1 បៃលំដាប់;
- 10 បៃមានតួអក្សរ 5 ទាបនៃឈ្មោះឯកសារ។
- គុណលក្ខណៈ 1 បៃ;
- 1 បៃបានបម្រុងទុក;
- 1 បៃ - ឈ្មោះ DOS checksum;
- 12 បៃមានតួអក្សរ 3 ទាបនៃឈ្មោះឯកសារ។
- 2 បៃ - ចំនួននៃចង្កោមដំបូង;
- តួអក្សរដែលនៅសល់នៃឈ្មោះវែង។
ធ្វើការជាមួយឯកសារជាភាសា C
ចំពោះអ្នកសរសេរកម្មវិធី ឯកសារបើកចំហត្រូវបានតំណាងជាលំដាប់នៃទិន្នន័យដែលកំពុងអាន ឬសរសេរ។ នៅពេលដែលឯកសារត្រូវបានបើក វាត្រូវបានភ្ជាប់ជាមួយ ស្ទ្រីម I/O. ព័ត៌មានលទ្ធផលត្រូវបានសរសេរទៅស្ទ្រីម ព័ត៌មានបញ្ចូលត្រូវបានអានពីស្ទ្រីម។
នៅពេលដែលការស្ទ្រីមត្រូវបានបើកសម្រាប់ I/O វាត្រូវបានភ្ជាប់ជាមួយនឹងរចនាសម្ព័ន្ធ FILE ស្តង់ដារ ដែលត្រូវបានកំណត់នៅក្នុង stdio.h ។ រចនាសម្ព័ន្ធ FILE មានព័ត៌មានចាំបាច់អំពីឯកសារ។
ការបើកឯកសារត្រូវបានធ្វើដោយប្រើមុខងារ fopen() ដែលត្រឡប់ទ្រនិចទៅរចនាសម្ព័ន្ធ FILE ដែលអាចត្រូវបានប្រើសម្រាប់ប្រតិបត្តិការជាបន្តបន្ទាប់នៅលើឯកសារ។
ឯកសារ * fopen (ឈ្មោះ, ប្រភេទ);
ឈ្មោះ - ឈ្មោះឯកសារដែលត្រូវបើក (រួមទាំងផ្លូវ)
ប្រភេទគឺជាទ្រនិចទៅខ្សែអក្សរដែលកំណត់ពីរបៀបដែលឯកសារត្រូវបានចូលប្រើ៖
- "r" - បើកឯកសារសម្រាប់ការអាន (ឯកសារត្រូវតែមាន);
- "w" - បើកឯកសារទទេសម្រាប់ការសរសេរ; ប្រសិនបើឯកសារមាន មាតិការបស់វាត្រូវបានបាត់បង់។
- "a" - បើកឯកសារសម្រាប់ការសរសេរដល់ទីបញ្ចប់ (សម្រាប់បន្ថែម); ឯកសារត្រូវបានបង្កើតប្រសិនបើវាមិនមាន;
- "r+" - បើកឯកសារសម្រាប់អាននិងសរសេរ (ឯកសារត្រូវតែមាន);
- "w+" - បើកឯកសារទទេសម្រាប់អាននិងសរសេរ; ប្រសិនបើឯកសារមាន មាតិការបស់វាត្រូវបានបាត់បង់។
- "a+" - បើកឯកសារសម្រាប់អាន និងបន្ថែម ប្រសិនបើឯកសារមិនមានទេ នោះវាត្រូវបានបង្កើត។
តម្លៃត្រឡប់គឺជាទ្រនិចទៅស្ទ្រីមបើកចំហ។ ប្រសិនបើកំហុសត្រូវបានជួបប្រទះ NULL ត្រូវបានត្រឡប់។
មុខងារ fclose() បិទស្ទ្រីម ឬស្ទ្រីមដែលភ្ជាប់ជាមួយឯកសារដែលបានបើកដោយប្រើមុខងារ fopen()។ ចរន្តដែលត្រូវបិទត្រូវបានកំណត់ដោយអាគុយម៉ង់នៃមុខងារ fclose() ។
តម្លៃត្រឡប់៖ តម្លៃ 0 ប្រសិនបើស្ទ្រីមត្រូវបានបិទដោយជោគជ័យ។ EOF ថេរប្រសិនបើមានកំហុសកើតឡើង។
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# រួមបញ្ចូល
int main()(
ឯកសារ * fp;
ឈ្មោះ char = "my.txt" ;
ប្រសិនបើ ((fp = fopen(ឈ្មោះ "r" )) == NULL)
{
printf( "បរាជ័យក្នុងការបើកឯកសារ");
getchar();
ត្រឡប់ 0;
}
// ជោគជ័យក្នុងការបើកឯកសារ
... // សកម្មភាពដែលត្រូវការលើទិន្នន័យ
fclose(fp);
getchar();
ត្រឡប់ 0;
}
ការអានតួអក្សរពីឯកសារ:
char fgetc (ស្ទ្រីម);
អាគុយម៉ង់មុខងារគឺជាទ្រនិចទៅចរន្តនៃប្រភេទ FILE ។ អនុគមន៍ត្រឡប់កូដតួអក្សរដែលបានអាន។ ប្រសិនបើចុងបញ្ចប់នៃឯកសារត្រូវបានឈានដល់ ឬមានកំហុសកើតឡើង នោះ EOF ថេរត្រូវបានត្រឡប់។
ការសរសេរនិមិត្តសញ្ញាទៅឯកសារ:
fputc (char, ស្ទ្រីម);
អាគុយម៉ង់របស់មុខងារគឺជាតួអក្សរ និងចង្អុលទៅស្ទ្រីមនៃប្រភេទ FILE ។ អនុគមន៍ត្រឡប់កូដតួអក្សរដែលបានអាន។
មុខងារ fscanf() និង fprintf() គឺស្រដៀងគ្នាទៅនឹងមុខងារ scanf() និង printf() ប៉ុន្តែដំណើរការជាមួយឯកសារទិន្នន័យ និងមានទ្រនិចឯកសារជាអាគុយម៉ង់ដំបូងរបស់ពួកគេ។
fscanf (ស្ទ្រីម "ទម្រង់បញ្ចូល" អាគុយម៉ង់);