გახსენით ფაილი პროგრამიდან c. ფაილის გახსნა. ჩართვისა და ექსტრაქციის ოპერატორები

თუ თქვენს კომპიუტერს აქვს ანტივირუსული პროგრამა შეუძლია დაასკანირეთ ყველა ფაილი კომპიუტერში, ისევე როგორც თითოეული ფაილი ინდივიდუალურად. ნებისმიერი ფაილის სკანირება შეგიძლიათ ფაილზე მაუსის მარჯვენა ღილაკით და ვირუსებზე ფაილის სკანირებისთვის შესაბამისი ვარიანტის არჩევით.

მაგალითად, ამ ფიგურაში, ფაილი my-file.c, შემდეგ თქვენ უნდა დააწკაპუნოთ ამ ფაილზე მაუსის მარჯვენა ღილაკით და ფაილის მენიუში აირჩიეთ ვარიანტი "სკანირება AVG-ით". ამ პარამეტრის არჩევით გაიხსნება AVG Antivirus და სკანირებს ფაილს ვირუსებზე.


ზოგჯერ შეცდომა შეიძლება გამოიწვიოს არასწორი ინსტალაცია პროგრამული უზრუნველყოფა , რაც შეიძლება გამოწვეული იყოს ინსტალაციის პროცესში წარმოქმნილი პრობლემის გამო. შეიძლება ხელი შეუშალოს თქვენს ოპერაციულ სისტემას დააკავშირეთ თქვენი C ფაილი სწორ აპლიკაციასთან, გავლენას ახდენს ე.წ "ფაილის გაფართოების ასოციაციები".

ზოგჯერ მარტივი ხელახლა დააინსტალირეთ UNIX Compact File Achiveშესაძლოა თქვენი პრობლემა გადაჭრას C-ის UNIX Compact File Achive-თან სათანადოდ დაკავშირებით. სხვა შემთხვევებში, ფაილების ასოცირების პრობლემები შეიძლება წარმოიშვას ცუდი პროგრამული უზრუნველყოფადეველოპერს და შეიძლება დაგჭირდეთ დეველოპერთან დაკავშირება შემდგომი დახმარებისთვის.


რჩევა:სცადეთ UNIX Compact File Achive-ის განახლება უახლესი ვერსიარათა დარწმუნდეთ, რომ უახლესი პატჩები და განახლებები დაინსტალირებულია.


ეს შეიძლება ძალიან აშკარად ჩანდეს, მაგრამ ხშირად თავად C ფაილმა შეიძლება გამოიწვიოს პრობლემა. თუ თქვენ მიიღეთ ფაილი ელფოსტის დანართით ან ჩამოტვირთეთ იგი ვებსაიტიდან და ჩამოტვირთვის პროცესი შეფერხდა (მაგალითად, ელექტროენერგიის გათიშვის ან სხვა მიზეზის გამო), ფაილი შეიძლება იყოს დაზიანებული. თუ შესაძლებელია, სცადეთ C ფაილის ახალი ასლის მიღება და ხელახლა გახსნა.


ფრთხილად:დაზიანებულმა ფაილმა შეიძლება გამოიწვიოს თქვენი კომპიუტერის წინა ან არსებული მავნე პროგრამა, ამიტომ მნიშვნელოვანია, რომ თქვენი კომპიუტერი განახლებული იყოს უახლესი ანტივირუსით.


თუ თქვენი ფაილი არის C დაკავშირებულია თქვენს კომპიუტერში არსებულ აპარატურასთანფაილის გასახსნელად, რომელიც შეიძლება დაგჭირდეთ მოწყობილობის დრაივერების განახლებადაკავშირებულია ამ აღჭურვილობასთან.

Ეს პრობლემა ჩვეულებრივ ასოცირდება მედია ფაილის ტიპებთან, რომლებიც დამოკიდებულია კომპიუტერის შიგნით ტექნიკის წარმატებით გახსნაზე, მაგალითად, ხმის ბარათი ან ვიდეო ბარათი. მაგალითად, თუ ცდილობთ აუდიო ფაილის გახსნას, მაგრამ ვერ გახსნით, შეიძლება დაგჭირდეთ ხმის ბარათის დრაივერების განახლება.


რჩევა:თუ როცა ცდილობთ C ფაილის გახსნას მიიღებთ .SYS ფაილთან დაკავშირებული შეცდომის შეტყობინება, პრობლემა შეიძლება იყოს დაკავშირებულია მოწყობილობის დაზიანებულ ან მოძველებულ დრაივერებთანრომელიც უნდა განახლდეს. ამ პროცესის გაადვილება შესაძლებელია დრაივერის განახლების პროგრამული უზრუნველყოფის გამოყენებით, როგორიცაა DriverDoc.


თუ ნაბიჯებმა პრობლემა არ გადაჭრადა თქვენ ჯერ კიდევ გაქვთ პრობლემები C ფაილების გახსნისას, ეს შეიძლება გამოწვეული იყოს ხელმისაწვდომი სისტემის რესურსების ნაკლებობა. C ფაილების ზოგიერთ ვერსიას შეიძლება დასჭირდეს რესურსების მნიშვნელოვანი რაოდენობა (მაგ. მეხსიერება/RAM, დამუშავების სიმძლავრე) თქვენს კომპიუტერში სწორად გასახსნელად. ეს პრობლემა საკმაოდ ხშირია, თუ ერთდროულად იყენებთ საკმაოდ ძველ კომპიუტერულ აპარატურას და ბევრად უფრო ახალ ოპერაციულ სისტემას.

ეს პრობლემა შეიძლება წარმოიშვას, როდესაც კომპიუტერს უჭირს დავალების შესრულება, რადგან ოპერაციული სისტემა(და ფონზე გაშვებული სხვა სერვისები) შეუძლია მოიხმარენ ძალიან ბევრ რესურსს C ფაილის გასახსნელად. სცადეთ დახუროთ ყველა აპლიკაცია თქვენს კომპიუტერში UNIX Compact File Achive-ის გახსნამდე. თქვენს კომპიუტერზე არსებული ყველა რესურსის გათავისუფლებით, თქვენ უზრუნველყოფთ საუკეთესო პირობებს C-ის გახსნის მცდელობისთვის.


Თუ შენ დაასრულა ყველა ზემოთ ჩამოთვლილი ნაბიჯიდა თქვენი C ფაილი მაინც არ იხსნება, შეიძლება დაგჭირდეთ გაშვება ტექნიკის განახლება. უმეტეს შემთხვევაში, ტექნიკის უფრო ძველი ვერსიების შემთხვევაშიც კი, დამუშავების სიმძლავრე მაინც შეიძლება იყოს საკმარისზე მეტი მომხმარებლის აპლიკაციების უმეტესობისთვის (თუ არ აკეთებთ პროცესორის ინტენსიურ მუშაობას, როგორიცაა 3D რენდერი, ფინანსური/სამეცნიერო მოდელირება ან მედია ინტენსიური სამუშაოები. ) . Ამგვარად, სავარაუდოა, რომ თქვენს კომპიუტერს არ აქვს საკმარისი მეხსიერება(უფრო ხშირად მოიხსენიება როგორც "RAM", ან ოპერატიული მეხსიერება) ფაილის გახსნილი დავალების შესასრულებლად.

ბოლო განახლება: 25.10.2017

ფაილებთან მუშაობისთვის, სტანდარტული ბიბლიოთეკა განსაზღვრავს სათაურის ფაილს fstream, რომელიც განსაზღვრავს ფაილების წაკითხვისა და ჩაწერის ძირითად ტიპებს. კერძოდ, ესენია:

    ifstream: ფაილიდან წასაკითხად

    ofstream: ფაილში ჩასაწერად

    fstream: აერთიანებს წერასა და კითხვას

wchar_t ტიპის მონაცემებთან მუშაობისთვის, ტყუპები განისაზღვრება ამ ნაკადებისთვის:

    wifstream

    ვოფსტრიმი

    wfstream

ფაილის გახსნა

ფაილზე მუშაობისას ჯერ უნდა გახსნათ ფაილი open() ფუნქციის გამოყენებით. ამ ფუნქციას აქვს ორი ვერსია:

  • ღია (გზა, რეჟიმი)

ფაილის გასახსნელად, ფაილის გზა უნდა გადაეცეს ფუნქციას, როგორც სტრიქონი. თქვენ ასევე შეგიძლიათ მიუთითოთ გახსნის რეჟიმი. ფაილის გახსნის ხელმისაწვდომი რეჟიმების სია:

    ios::in : ფაილი იხსნება შეყვანისთვის (კითხვისთვის). დაყენება შესაძლებელია მხოლოდ ifstream ან fstream ობიექტზე

    ios::out : ფაილი იხსნება გამოსასვლელად (ჩასაწერად). ეს წაშლის ძველ მონაცემებს. შეიძლება დაყენდეს მხოლოდ სტრიმინგ ან დინამიკურ ობიექტზე

    ios::app : ფაილი იხსნება ჩასაწერად. ძველი მონაცემები არ იშლება.

    ios::ate : ფაილის გახსნის შემდეგ, მაჩვენებელს ფაილის ბოლოს გადააქვს

    ios::trunc: ფაილი იჭრება გახსნისას. შეიძლება დაყენდეს, თუ რეჟიმი ასევე დაყენებულია გამორთვის

    ios::binary: გახსენით ფაილი ორობით რეჟიმში

თუ გახსნისას არ არის მითითებული რეჟიმი, ნაგულისხმევი რეჟიმი ნაგულისხმევი ობიექტებისთვის არის ios::out, ხოლო ifstream ობიექტების ნაგულისხმევი რეჟიმი ios::in. fstream ობიექტებისთვის, ios::out და ios::in რეჟიმები გაერთიანებულია.

Std::ofstream out; // ნაკადი ჩასაწერად out.open("D:\\hello1.txt"); // ფაილის გახსნა std::ofstream out2 დასაწერად; out2.open("D:\\hello2.txt", std::ios::app); // ფაილის გახსნა std::ofstream out3 დასამატებლად; out2.open("D:\\hello3.txt", std::ios::out | std::ios::trunc); // დააყენეთ მრავალი რეჟიმი std::ifstream in; // ნაკადი წასაკითხად. open("D:\\hello4.txt"); // გახსენით ფაილი წასაკითხად std::fstream fs; // წაკითხვა-ჩაწერა ნაკადი fs.open("D:\\hello5.txt"); // გახსენით ფაილი წაკითხვა-ჩაწერისთვის

თუმცა, პრინციპში, ფაილის გასახსნელად არ არის აუცილებელი ღია ფუნქციის გამოყენება. გარდა ამისა, თქვენ ასევე შეგიძლიათ გამოიყენოთ ნაკადის ობიექტის კონსტრუქტორი და გადასცეთ ფაილის გზა და ღია რეჟიმი მათ:

fstream (გზა) fstream (ბილიკი, რეჟიმი)

როდესაც გამოიძახება კონსტრუქტორი, რომელზეც გადადის ფაილის გზა, ეს ფაილი ავტომატურად გაიხსნება:

std::ofstream out("D:\\hello.txt"); std::ifstream in("D:\\hello.txt"); std::fstream fs("D:\\hello.txt", std::ios::app);

ზოგადად, ნაკადის გასახსნელად კონსტრუქტორების გამოყენება სასურველია, რადგან ფაილის ნაკადის გამომსახველი ცვლადის განსაზღვრა უკვე ვარაუდობს, რომ ნაკადი გაიხსნება წასაკითხად ან ჩასაწერად. კონსტრუქტორის გამოყენება კი გვიხსნის იმ სიტუაციისგან, როცა ნაკადის გახსნა გვავიწყდება, მაგრამ ამავდროულად ვიწყებთ მის გამოყენებას.

მუშაობისას ჩვენ შეგვიძლია შევამოწმოთ არის თუ არა ფაილი ღია is_open() ფუნქციის გამოყენებით. თუ ფაილი ღიაა, მაშინ ის ბრუნდება true:

Std::ifstream in; // ნაკადი წასაკითხად. open("D:\\hello.txt"); // გახსენით ფაილი წასაკითხად // თუ ფაილი ღიაა, თუ (in.is_open()) ( )

ფაილის დახურვა

მას შემდეგ რაც დაასრულებთ ფაილთან მუშაობას, უნდა დახუროთ ის close() ფუნქციით. აღსანიშნავია ისიც, რომ როდესაც ნაკადის ობიექტი სცილდება, ის იშლება და მასზე ავტომატურად გამოიძახება დახურვის ფუნქცია.

#შეიცავს #შეიცავს int main() ( std::ofstream out; // ნაკადი ჩასაწერად. open("D:\\hello.txt"); // ფაილის გახსნა ჩასაწერად. close(); // ფაილის დახურვა std:: ifstream in; // ნაკადის წაკითხვა in.open ("D:\\hello.txt"); // ფაილის გახსნა წასაკითხად in.close(); // ფაილის დახურვა std::fstream fs; // ნაკადის წაკითხვა - ჩაწერა fs.open("D:\\hello.txt"); // გახსენით ფაილი წასაკითხად-ჩასაწერად fs.close(); // დახურეთ ფაილის დაბრუნება 0; )

აღსანიშნავია, რომ g++-ით შედგენისას უნდა იყოს გამოყენებული -static დროშა, თუ პროგრამა მუშაობს ფაილებთან და იყენებს ტიპებს fstream header ფაილიდან.

ფაილები საშუალებას აძლევს მომხმარებელს წაიკითხოს დიდი რაოდენობით მონაცემები პირდაპირ დისკიდან კლავიატურაზე აკრეფის გარეშე. არსებობს ორი ძირითადი ტიპის ფაილი: ტექსტი და ორობითი.

ტექსტიეწოდება ფაილები, რომლებიც შედგება ნებისმიერი სიმბოლოსგან. ისინი ორგანიზებულია ხაზებად, რომელთაგან თითოეული მთავრდება პერსონაჟით " ხაზის დასასრული". თავად ფაილის დასასრული მითითებულია სიმბოლოთი " ფაილის დასასრული". ტექსტურ ფაილში ინფორმაციის ჩაწერისას, რომლის ნახვა შესაძლებელია ნებისმიერის გამოყენებით ტექსტის რედაქტორი, ყველა მონაცემი გარდაიქმნება სიმბოლოს ტიპად და ინახება სიმბოლოების სახით.

ორობითიფაილებში ინფორმაცია იკითხება და იწერება გარკვეული ზომის ბლოკების სახით, რომლებშიც შესაძლებელია ნებისმიერი სახის და სტრუქტურის მონაცემების შენახვა.

ფაილებთან მუშაობისთვის გამოიყენება მონაცემთა სპეციალური ტიპები, ე.წ ნაკადები.ნაკადი ifstreamგამოიყენება ფაილებთან წაკითხვის რეჟიმში მუშაობისთვის და დინების გარეთჩაწერის რეჟიმში. ნაკადი გამოიყენება ფაილებთან მუშაობისთვის როგორც ჩაწერის, ასევე წაკითხვის რეჟიმში. fstream.

C++ პროგრამებში ტექსტურ ფაილებთან მუშაობისას აუცილებელია ბიბლიოთეკების ჩართვა iostreamდა fstream.

იმისათვის, რომ ჩაწეროთ მონაცემები ტექსტურ ფაილში, თქვენ უნდა:

  1. აღწერეთ ტიპის ცვლადი დინების გარეთ.
  2. გახსნა.
  3. ფაილში ინფორმაციის გატანა.
  4. აუცილებლად დახურეთ ფაილი.

ტექსტური ფაილიდან მონაცემების წასაკითხად თქვენ უნდა:

  1. აღწერეთ ტიპის ცვლადი ifstream.
  2. გახსენით ფაილი ფუნქციით გახსნა.
  3. ფაილიდან ინფორმაციის წასაკითხად, თითოეული მონაცემის წაკითხვისას აუცილებელია შეამოწმოთ მიღწეულია თუ არა ფაილის დასასრული.
  4. დახურეთ ფაილი.

ინფორმაციის ჩაწერა ტექსტურ ფაილში

როგორც უკვე აღვნიშნეთ, ტექსტურ ფაილთან მუშაობის დასაწყებად, თქვენ უნდა გამოაცხადოთ ტიპის ცვლადი დინების გარეთ. მაგალითად, ასე:

ნაკადიდან F;

შეიქმნება ცვლადი ფაილში ინფორმაციის ჩასაწერად. შემდეგი ნაბიჯი არის ფაილის გახსნა ჩასაწერად. ზოგადად, ნაკადის გახსნის ოპერატორი ასე გამოიყურება:

.გახსნა("ფაილი", რეჟიმი);

Აქ არის ცვლადი გამოცხადებული როგორც დინების გარეთ, ფაილი- ფაილის სრული სახელი დისკზე, რეჟიმი- გახსნილი ფაილით მუშაობის რეჟიმი. გთხოვთ, გაითვალისწინოთ, რომ ფაილის სრული სახელის მითითებისას, თქვენ უნდა დააყენოთ ორმაგი ხაზი. მაგალითად, ფაილზე წვდომისთვის ანგარიშები.txtმდებარეობს საქაღალდეში საიტები დისკზე , პროგრამაში უნდა იყოს მითითებული: D: \\ საიტები \\ ანგარიშები.ტექსტი.

ფაილის გახსნა შესაძლებელია ერთ-ერთ შემდეგ რეჟიმში:

  • ios::in- ფაილის გახსნა მონაცემთა წაკითხვის რეჟიმში; რეჟიმი არის ნაგულისხმევი რეჟიმი ძაფებისთვის ifstream;
  • ios:: out- გახსენით ფაილი მონაცემთა ჩაწერის რეჟიმში (ამ შემთხვევაში, ინფორმაცია არსებული ფაილის შესახებ განადგურებულია); რეჟიმი არის ნაგულისხმევი რეჟიმი ძაფებისთვის დინების გარეთ;
  • ios:: აპლიკაცია- გახსენით ფაილი მონაცემთა ჩაწერის რეჟიმში ფაილის ბოლომდე;
  • ios::ჭამა- გადადით უკვე გახსნილი ფაილის ბოლოს;
  • ios:: trunc- გაასუფთავეთ ფაილი, იგივე ხდება ios::out რეჟიმში;
  • ios:: nocreate- არ გახსნათ ფაილი, თუ ის არ არსებობს;
  • ios::noreplace- არ გახსნათ არსებული ფაილი.

რეჟიმის პარამეტრი შეიძლება არ იყოს, ამ შემთხვევაში ფაილი იხსნება ნაგულისხმევ რეჟიმში ამ ნაკადისთვის.

ფაილის წარმატებით გახსნის შემდეგ (ნებისმიერ რეჟიმში) ცვლადში შეინახება მართალია, წინააღმდეგ შემთხვევაში ყალბი. ეს შეამოწმებს ფაილის გახსნის ოპერაციის სისწორეს.

გახსენით ფაილი (მაგალითად, აიღეთ ფაილი D: \\ საიტები \\ ანგარიშები.ტექსტი) ჩაწერის რეჟიმში ერთ-ერთი შემდეგი გზით:

ფაილის ჩაწერის რეჟიმში გახსნის შემდეგ, შეიქმნება ცარიელი ფაილი, რომელშიც შეიძლება ჩაიწეროს ინფორმაცია.

თუ გსურთ გახსნათ არსებული ფაილი დამატების რეჟიმში, მაშინ უნდა გამოიყენოთ მნიშვნელობა ios:: აპლიკაცია.

ფაილის ჩაწერის რეჟიმში გახსნის შემდეგ, შეგიძლიათ დაწეროთ მას ისე, როგორც ეკრანზე, მხოლოდ სტანდარტული გამომავალი მოწყობილობის ნაცვლად. კოუტთქვენ უნდა მიუთითოთ ღია ფაილის სახელი.

მაგალითად, ნაკადზე დაწერა ცვლადი , გამომავალი განცხადება ასე გამოიყურება:

ფ<

ნაკადზე სერიული გამოსასვლელად ცვლადები , , გამომავალი განცხადება ხდება:

გ<

ნაკადი დახურულია ოპერატორის გამოყენებით:

ვ.close();

მაგალითად, განიხილეთ შემდეგი პრობლემა.

დავალება 1

შექმენით ტექსტური ფაილი დ:\\ საიტები\\ანგარიშები .ტექსტიდა ჩაწერეთ მასში რეალური რიცხვები.

გამოსავალი

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

#include "stdafx.h"
#შეიცავს
#შეიცავს
#შეიცავს
namespace std-ის გამოყენებით;
int main()
{

int i, n;
ორმაგი ა;
//აღწერს ნაკადს ფაილში მონაცემების ჩასაწერად
გაღმა f;
//გახსენით ფაილი ჩაწერის რეჟიმში,
//mode ios::out დაყენებულია ნაგულისხმევად
f.open("D: \\sites\\accounts.txt",ios::out);
//შეიყვანეთ რეალური რიცხვების რაოდენობა
კოუტ<< «n=» ; cin >>n;
//მარყუჟი რეალური რიცხვების შეყვანისთვის
//და ჩაწერეთ ისინი ფაილში
ამისთვის (i= 0; i< n; i++ )
{
კოუტ<< «a=» ;
//შეყვანის ნომერი
cin >> a;
ვ<< a<< «\t";
}
//ნაკადის დახურვა
ვ.close();
სისტემა ("პაუზა");
დაბრუნება 0;
}

ინფორმაციის წაკითხვა ტექსტური ფაილიდან

ტექსტური ფაილიდან ინფორმაციის წასაკითხად აუცილებელია ტიპის ცვლადის გამოცხადება ifstream. ამის შემდეგ, თქვენ უნდა გახსნათ ფაილი ოპერატორის გამოყენებით წასაკითხად გახსნა. თუ ცვლადი დასახელებულია , მაშინ პირველი ორი განცხადება იქნება:

ფაილის წაკითხვის რეჟიმში გახსნის შემდეგ, შეგიძლიათ მისგან ინფორმაციის წაკითხვა ისევე, როგორც კლავიატურიდან, მხოლოდ ამის ნაცვლად ცინთქვენ უნდა მიუთითოთ ნაკადის სახელი, საიდანაც წაიკითხება მონაცემები.

მაგალითად, ნაკადიდან მონაცემების წასაკითხად ცვლადში , შეყვანის განცხადება ასე გამოიყურება:

F>>a;

ტექსტის რედაქტორში ორი რიცხვი განცალკევებულად ითვლება, თუ მათ შორის არის მინიმუმ ერთი სიმბოლო: ინტერვალი, ჩანართი, ხაზის ბოლოს სიმბოლო. კარგია, როცა პროგრამისტმა წინასწარ იცის, რამდენი და რა მნიშვნელობა ინახება ტექსტურ ფაილში. თუმცა, ხშირად ცნობილია მხოლოდ ფაილში შენახული მნიშვნელობების ტიპი და მათი რაოდენობა შეიძლება განსხვავდებოდეს. ამ პრობლემის გადასაჭრელად აუცილებელია ფაილიდან მნიშვნელობების სათითაოდ წაკითხვა და ყოველი წაკითხვის წინ შეამოწმეთ მიღწეულია თუ არა ფაილის დასასრული. და ფუნქცია დაგეხმარებათ ამის გაკეთებაში f.eof(). Აქ - ძაფის სახელის ფუნქცია აბრუნებს ლოგიკურ მნიშვნელობას: მართალიაან ყალბი, იმის მიხედვით, მიღწეულია თუ არა ფაილის ბოლომდე.

ამრიგად, მთელი ფაილის შინაარსის წაკითხვის ციკლი შეიძლება დაიწეროს ასე:

მასალის უკეთესი ასიმილაციისთვის განიხილეთ პრობლემა.

დავალება 2

რეალური ნომრები ინახება ტექსტურ ფაილში D:\\game\\accounts.txt, აჩვენეთ ისინი ეკრანზე და გამოთვალეთ მათი რაოდენობა.

გამოსავალი

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39

#include "stdafx.h"
#შეიცავს
#შეიცავს
#შეიცავს
#შეიცავს
namespace std-ის გამოყენებით;
int main()
{
setlocale(LC_ALL, "RUS");
int n= 0 ;
ათწილადი ა;
fstream F;
//გახსენით ფაილი წაკითხვის რეჟიმში
f.open("D: \\sites\\accounts.txt") ;
//თუ ფაილი სწორად გაიხსნა, მაშინ
თუ (F)
{
//ციკლი ფაილიდან მნიშვნელობების წასაკითხად; მარყუჟის შესრულება შეწყდება,
//როდესაც მივაღწევთ ფაილის ბოლოს, ამ შემთხვევაში F.eof() დაბრუნდება true.
ხოლო (! F.eof () )
{
//შემდეგი მნიშვნელობის კითხვა F ნაკადიდან a ცვლადში
F>> a;
//გამოიტანეთ a ცვლადის მნიშვნელობა ეკრანზე
კოუტ<< a<< «\t";
//წაკითხული რიცხვების რაოდენობის გაზრდა
n++ ;
}
//ნაკადის დახურვა
ვ.close();
//ეკრანზე წაკითხული რიცხვების რაოდენობის შეყვანა
კოუტ<< «n=» << n<< endl;
}
//თუ ფაილი არასწორად გაიხსნა, მაშინ გამომავალი
//შეტყობინებები ასეთი ფაილის არარსებობის შესახებ
სხვა კოუტ<< "ფაილი არ არსებობს"<< endl;
სისტემა ("პაუზა");
დაბრუნება 0;
}

ამით დასრულდა შედარებით მოცულობითი გაკვეთილი ტექსტურ ფაილებზე. შემდეგი სტატია განიხილავს მანიპულირების მეთოდებს, რომლებსაც C++ იყენებს.

I/O-ს მიერ შემუშავებული მექანიზმი არ შეესაბამება დღეს ობიექტზე ორიენტირებული პროგრამირების ზოგადად მიღებულ სტილს, გარდა ამისა, იგი აქტიურად იყენებს მაჩვენებლის ოპერაციებს, რომლებიც პოტენციურად სახიფათოა თანამედროვე უსაფრთხო კოდის შესრულების გარემოში. აპლიკაციის განვითარების ალტერნატივა არის სტანდარტული I/O კლასის მექანიზმი, რომელიც გათვალისწინებულია C++ ენის სტანდარტით.

ფაილების გახსნა

ყველაზე ხშირად გამოყენებული კლასები არის ifstream კითხვისთვის, ofstream წერისთვის და fstream ფაილების შესაცვლელად.

ყველა ხრახნიანი I/O კლასი ირიბად მიღებულია საერთო წინაპარი ios-დან, სრულად მემკვიდრეობით მის ფუნქციონირებას. მაგალითად, open_mode enumerated data წევრი განსაზღვრავს ფაილის ღია რეჟიმს, რომელიც განისაზღვრება შემდეგნაირად:

Enum open_mode (აპი, ორობითი, in, out, trunc, ate);

ქვემოთ მოცემულია დროშების შესაძლო მნიშვნელობები და მათი დანიშნულება.

მაგალითად, ფაილის სახელწოდებით test.txt გასახსნელად ბინარული მონაცემების წასაკითხად, თქვენ დაწერთ:

ifstream ფაილი; file.open("test.txt", ios::in | ios::ბინარული);

ლოგიკური OR ოპერატორი (|) საშუალებას გაძლევთ შეადგინოთ რეჟიმი დროშების ნებისმიერი კომბინაციით. იმისათვის, რომ ფაილის წერით გახსნისას, შემთხვევით არ გადაიწეროთ არსებული ფაილი იგივე სახელით, უნდა გამოიყენოთ შემდეგი ფორმა:

offstream ფაილი; file.open("test.txt", ios::out | ios::app);

ვარაუდობენ, რომ შესაბამისი სათაურის ფაილი დაკავშირებულია პროექტთან:

#შეიცავს

იმის შესამოწმებლად, თუ ფაილი წარმატებით გაიხსნა, შეგიძლიათ გამოიყენოთ კონსტრუქცია

თუ (! ფაილი) ( // ფაილის გახსნის შეცდომის დამუშავება )

ჩართვისა და ექსტრაქციის ოპერატორები

გადარიცხულია ფაილების დამუშავების კლასებში მოიცავს ოპერატორს (<<) записывает данные в файловый поток. Как только вы открыли файл для записи, можно записывать в него текстовую строку целиком:

ფაილი<< "Это строка текста";

თქვენ ასევე შეგიძლიათ დაწეროთ ტექსტის სტრიქონი ნაწილებად:

ფაილი<< "Это " << "строка " << "текста";

endl განცხადება ამთავრებს ხაზის შეყვანას კარის დაბრუნებით:

ფაილი<< "Это строка текста" << endl;

ჩათვლით ოპერატორის გამოყენებით, ადვილია ფაილში ცვლადების ან მასივის ელემენტების მნიშვნელობების ჩაწერა:

Offstream ფაილი ("Temp.txt"); char buff = "ტექსტური მასივი შეიცავს ცვლადებს"; int vx = 100; float pi = 3.14159; ფაილი<< buff << endl << vx << endl << pi << endl;

კოდის შესრულების შედეგად წარმოიქმნება Temp.txt ტექსტური ფაილის სამი ხაზი:

ტექსტური მასივი შეიცავს ცვლადებს 100 3.14159

გაითვალისწინეთ, რომ რიცხვითი მნიშვნელობები იწერება ფაილში ტექსტის სტრიქონების სახით და არა ორობითი მნიშვნელობებით.

ამოღების ოპერატორი(>>) აკეთებს პირიქით. როგორც ჩანს, ადრე დაწერილი Temp.txt ფაილიდან სიმბოლოების ამოსაღებად, თქვენ უნდა დაწეროთ შემდეგი კოდი:

ifstream ფაილი ("Temp.txt"); char buff; intvx; floatpi; ფაილი >> buff >> vx >> pi;

თუმცა, ამოღების ოპერატორი გაჩერდება პირველ დელიმიტერზე (სივრცე, ჩანართი ან ახალი ხაზი), რომელსაც ის შეხვდება. ამრიგად, წინადადების „ტექსტური მასივი შეიცავს ცვლადებს“ ანალიზისას, მხოლოდ სიტყვა „ტექსტი“ ჩაიწერება მასივის ბუფში, სივრცე იგნორირებული იქნება და სიტყვა „მასივი“ გახდება მთელი რიცხვი ცვლადის vx და კოდი. აღსრულება "გააფუჭებს" მონაცემთა სტრუქტურის გარდაუვალი დარღვევით. შემდეგ, ifstream კლასზე განხილვისას, ჩვენ ვაჩვენებთ, თუ როგორ სწორად მოაწყოთ ფაილის წაკითხვა წინა მაგალითიდან.

ifstream კლასი: ფაილების კითხვა

როგორც სახელი გულისხმობს, ifstream კლასი შექმნილია ფაილის ნაკადის შესაყვანად. კლასის ძირითადი მეთოდები ჩამოთვლილია ქვემოთ. მათი უმეტესობა მემკვიდრეობით მიიღება istream კლასიდან და გადატვირთულია მშობლის ფუნქციებით. მაგალითად, get ფუნქციას, ზარის პარამეტრიდან გამომდინარე, შეუძლია წაიკითხოს არა მხოლოდ ერთი სიმბოლო, არამედ სიმბოლოების ბლოკიც.

ახლა გასაგებია, თუ როგორ უნდა შეცვალოთ წინა მაგალითი ისე, რომ მონაცემთა ამოღების ოპერატორის გამოყენებით მივიღოთ მოსალოდნელი შედეგი:

ifstream ფაილი ("Temp.txt"); char buff; intvx; floatpi; file.getline(buff, sizeof(buff)); ფაილი >> vx >> pi:

getline მეთოდი ბოლომდე წაიკითხავს ფაილის პირველ სტრიქონს და >> ოპერატორი მიანიჭებს მნიშვნელობებს ცვლადებს.

შემდეგი მაგალითი გვიჩვენებს ტექსტურ ფაილში მონაცემების დამატებას და შემდეგ მთელი ფაილის წაკითხვას. while (1) მარყუჟი გამოიყენება while(!file2.eof())-ის ნაცვლად ში განხილული მიზეზების გამო.

#შეიცავს #შეიცავს namespace std-ის გამოყენებით; int main() ( ნაკადის ფაილი; file.open ("test.txt",ios::out|ios::app); if (!ფაილი) (cout<< "File error - can"t open to write data!"; cin.sync(); cin.get(); return 1; } for (int i=0; i<10; i++) file << i << endl; file.close(); ifstream file2; file2.open("test.txt", ios::in); if (!file2) { cout << "File error - can"t open to read data!"; cin.sync(); cin.get(); return 2; } int a,k=0; while (1) { file2 >>ა; if (file2.eof()) break; კოუტ<< a << " "; k++; } cout << endl << "K=" << k << endl; file2.close(); cin.sync(); cin.get(); return 0; }

შემდეგი მაგალითი კითხულობს ხაზებს ფაილის test.txt-დან და აჩვენებს მათ კონსოლზე.

#შეიცავს #შეიცავს namespace std-ის გამოყენებით; int main() ( ifstream ფაილი; // შექმენით ნაკადის ობიექტი ფაილი file.open("test.txt"); // გახსენით ფაილი წასაკითხად, თუ (!file) დააბრუნებს 1; // შეცდომის დაბრუნებას char str;/ / სტატიკური ხაზის ბუფერი // წაიკითხეთ და აჩვენეთ ხაზები მარყუჟში eof-მდე, ხოლო (!file.getline(str, sizeof(str)).eof()) cout<< str << endl; // вывод прочитанной строки на экран cin.sync(); cin.get(); return 0; }

ეს კოდი Windows OS-ში ასევე დამოკიდებულია ფაილის ბოლო სტრიქონში ახალი ხაზის სიმბოლოს არსებობაზე, უფრო საიმედო იქნება ამის გაკეთება:

while (1) ( if (file.eof()) break; file.getline(str, sizeof(str)); cout<< str << endl; }

ღია და დახურვის მეთოდებზე აშკარა ზარები არჩევითია. მართლაც, კონსტრუქტორის არგუმენტით გამოძახება საშუალებას გაძლევთ დაუყოვნებლივ გახსნათ ფაილი, ფაილის ნაკადის ობიექტის შექმნის მომენტში:

ifstream ფაილი ("test.txt");

დახურვის მეთოდის ნაცვლად შეგიძლიათ გამოიყენოთ delete ოპერატორი, რომელიც ავტომატურად გამოიძახებს ფაილის ობიექტის დესტრუქტორს და დახურავს ფაილს. while მარყუჟის კოდი უზრუნველყოფს ფაილის ბოლოს სათანადო შემოწმებას.

ofstream class: ფაილების წერა

ofstream კლასი შექმნილია ფაილის ნაკადიდან მონაცემების გამოსატანად. ამ კლასის ძირითადი მეთოდები ჩამოთვლილია ქვემოთ.

ზემოთ აღწერილი ჩათვლით ოპერატორი მოსახერხებელია ტექსტურ ფაილზე ჩაწერის ორგანიზებისთვის:

Offstream ფაილი ("temp.txt"); თუ (!ფაილი) დაბრუნდება; for (int i=1; i<=3; i++) file << "Строка " << i << endl; file.close();

ორობითი

პრინციპში, ორობითი მონაცემები ემსახურება ტექსტის მონაცემებს. განსხვავება ისაა, რომ თუ ორობითი მონაცემები იწერება გარკვეულ ლოგიკურ სტრუქტურაში, მაშინ ისინი უნდა წაიკითხონ ფაილიდან იმავე სტრუქტურის ტიპის ცვლადში.

ჩაწერისა და წაკითხვის მეთოდების პირველი პარამეტრი (ჩაწერის/წაკითხვის ბლოკის მისამართი) უნდა იყოს სიმბოლოს მაჩვენებლის ტიპი char *, ამიტომ აუცილებელია ცალსახად გადაიყვანოთ void * სტრუქტურის მისამართის ტიპი. მეორე პარამეტრი მიუთითებს, რომ ფაილის ორობით ბლოკებს აქვთ ბაიტის მუდმივი ზომა, მიუხედავად ჩანაწერის რეალური სიგრძისა. შემდეგი დანართში მოცემულია მაგალითი იმისა, თუ როგორ უნდა შექმნათ და აჩვენოთ მონაცემები მარტივ ნოუთბუქში. შემდეგ ფაილის ჩანაწერები იკითხება თანმიმდევრულად და გამოჩნდება კონსოლზე.

#შეიცავს #შეიცავს #შეიცავს namespace std-ის გამოყენებით; struct Notes ( // ნოუთბუქის მონაცემთა სტრუქტურა char სახელი; // სრული სახელი char ტელეფონი; // phone int ასაკი; // ასაკი ); int main() ( setlocale (LC_ALL, "რუსული"); შენიშვნები Note1= ("გროზნი იოანე ვასილიევიჩი", "არ არის დაინსტალირებული", 60); შენიშვნები Note2= ("გოდუნოვი ბორის ფედოროვიჩი", "095-111-2233", 30); შენიშვნები შენიშვნა3= ("პეტერ რომანოვი", "812-333-2211", 20); ofile ნაკადის ("Notebook.dat", ios::binary); ofile.write ((char*)&Note1, sizeof ( შენიშვნები)); // 1-ლი ბლოკი ofile.write((char*)&Note2, sizeof(Notes)); // მე-2 ბლოკი ofile.write((char*)&Note3, sizeof(Notes)); // მე-3 ბლოკი ofile. close(); // დახურეთ დაწერილი ფაილი ifstream ifile ("Notebook.dat", ios::binary); შენიშვნები შენიშვნა; // სტრუქტურირებული ცვლადი char str; // სტატიკური სტრიქონის ბუფერი // წაიკითხეთ და აჩვენეთ ხაზები მარყუჟში, სანამ eof while (!ifile.read((char*)&Note, sizeof(Notes)).eof()) ( sprintf(str, "%s\tBody: %s\tAge: %d" , Note.Name, Note. ტელეფონი, შენიშვნა. ასაკი); cout<< str << endl; } ifile.close(); // закрыть прочитанный файл cin.sync(); cin.get(); return 0; }

ამ კოდის შესრულების შედეგად, ორობითი ფაილი Notebook.dat იქმნება სამი ბლოკისგან 80 ბაიტი თითოეული (დავარაუდეთ, რომ სიმბოლოები ერთბაიტიანია). ბუნებრივია, შეგიძლიათ გამოიყენოთ ნაკადის სხვა მეთოდები და შეასრულოთ ნებისმიერი ოპერაცია კონკრეტული მონაცემთა სტრუქტურის ველებზე.

fstream კლასი: ფაილების შემთხვევითი წვდომა

დავუშვათ, რომ ჩვენმა ბლოკნოტმა დააგროვა 100 ჩანაწერი და ჩვენ გვინდა დავთვალოთ 50-ე. რა თქმა უნდა, შეგიძლიათ მოაწყოთ ციკლი და წაიკითხოთ ყველა ჩანაწერი პირველიდან მოცემულამდე. ცხადია, უფრო მიზანმიმართული გამოსავალი არის pos ფაილის პოზიციის მაჩვენებლის დაყენება პირდაპირ 50-ზე და მისი წაკითხვა:

ifstream ifile ("Notebook.dat", ios::binary); int pos = 49 * sizeof(Notes); ifile seek(pos); // 50-ე ჩანაწერის ძიება შენიშვნები შენიშვნა; //Notes - ზემოთ აღწერილი "ჩანაწერის" სტრუქტურა ifile.read((char*)&Note, sizeof(Notes));

ასეთი საძიებო ოპერაციები ეფექტურია, თუ ფაილი შედგება ცნობილი და მუდმივი ზომის ჩანაწერებისგან. თვითნებური ჩანაწერის შინაარსის შესაცვლელად, თქვენ უნდა გახსნათ გამომავალი ნაკადი მოდიფიცირების რეჟიმში:

Ofstream ofile("Notebook.dat", ios::binary | ios::ate); int pos = 49 * sizeof(Notes); ofile seekp(pos); // მოძებნეთ 50-ე შენიშვნა შენიშვნები Note50 = ("ელცინ ბორის ნიკოლაევიჩი", "095-222-3322", 64); ofile.write((char*)&Note, sizeof(Notes)); // ჩანაცვლება

თუ არ მიუთითებთ ios::ate (ან ios::app) დროშას, მაშინ Notebook.dat ორობითი ფაილის გახსნისას მისი წინა შიგთავსი წაიშლება!

დაბოლოს, შესაძლებელია ფაილის ერთდროულად გახსნა წასაკითხად/ჩასაწერად, წინამორბედებისგან fstream ნაკადის კლასის მიერ მემკვიდრეობით მიღებული მეთოდების გამოყენებით. ვინაიდან fstream კლასი მიღებულია istream-დან და ostream-დან (ifstream-ის და ofstream-ის მშობლები შესაბამისად), ყველა ადრე აღნიშნული მეთოდი ხელმისაწვდომი ხდება აპლიკაციისთვის.

შემდეგი მაგალითი ცვლის პირველ და მესამე ჩანაწერებს Notebook.dat ფაილში.

#შეიცავს #შეიცავს #შეიცავს namespace std-ის გამოყენებით; struct Notes (char სახელი; char ტელეფონი; int ასაკი; ); int main() ( setlocale(LC_ALL, "რუსული"); შენიშვნები Note1, Note3; // ფაილის გახსნა ერთდროულად წაკითხვის/წერისთვის fstream ფაილის ("Notebook.dat", ios::binary | ios::in | ios:: out); file.seekg(2 * sizeof(Notes)); // იპოვეთ და წაიკითხეთ Note3 ფაილი. წაკითხვა ((char*)&Note3, sizeof(Notes)); file.seekg(0); // იპოვეთ და წაიკითხეთ შენიშვნა1 file.read((char*)&Note1, sizeof(Notes)); file.seekg(0); // Note1<== Note3 file.write((char*)&Note3, sizeof(Notes)); file.seekg(2 * sizeof(Notes)); // Note3 <== Note1 file.write((char*)&Note1, sizeof(Notes)); char str; // Считывать и отображать записи в цикле, пока не eof file.seekg(0); // вернуться к началу файла while (!file.read((char*)&Note1, sizeof(Notes)).eof()) { sprintf(str, "%s\tТел: %s\tВозраст: %d", Note1.Name, Note1.Phone, Note1.Age); cout << str << endl; } file.close(); cin.sync(); cin.get(); return 0; }

ios::in და ios::out დროშები უნდა იყოს მითითებული ფაილის ობიექტის კონსტრუქტორში, რათა დაუშვას წაკითხვის და ჩაწერის ერთდროულად ოპერაციები. ამ კოდის შესრულების შედეგად, Notebook.dat ორობითი ფაილის პირველი და მესამე ჩანაწერები შეიცვლება.

არის დამატებითი მაგალითები თემაზე.

გაქვთ შეკითხვები?

შეატყობინეთ შეცდომას

ტექსტი უნდა გაიგზავნოს ჩვენს რედაქტორებს: