Mətn faylından ikinci sətri oxumaq c. C dilində mətn faylları ilə işləmək

Biz artıq mətn faylına məlumat yazmağı öyrənmişik. – Necə öyrənməmisinizsə, əvvəlki məqaləyə baxın. Təfərrüatı ilə izah olunur və təsvir edilir

Bəs fayl artıq mövcuddursa və emal üçün ondan məlumatları oxumalıyıqsa? Xoşbəxtlikdən, bu da olduqca sadədir. Xatırladım ki, bu tapşırığı həyata keçirmək üçün bir neçə variant var, onlardan yalnız birini təsvir etdim; Təsvir edilən biri nədənsə şəxsən mənə başa düşmək üçün ən asan görünəndir.

#daxildir

int main()
{
char s1 //Dəyişən sətri oxuyacaq
ifstream-də (“C:\\\FromC\\myfile.txt”); //Məlumatı oxumaq üçün faylı açın
>>s1-də; //xəttini oxuyun
in.close() // Faylın bağlanması

cout<Dəyəri çıxarın s1 ekrana
0 qaytarın;
}

Budur, yol boyunca yerləşən mətn faylından birinci sətri oxumaq üçün ən sadə proqram
C:\\\FromC\\myfile.txt –
Bu, əvvəlki məqalənin davamı olduğundan, orada yaratdığımız fayldan istifadə etmək qərarına gəldim. Yəqin ki, bununla bağlı heç bir çətinlik olmamalıdır.
Ancaq koda qayıdaq. Əvvəlcə ondan məlumatları oxumaq üçün faylı açırıq, bunun üçün əmrdən istifadə edirik ifstream mötərizədə mən etdiyim kimi ya faylın adını, ya da faylın yolunu göstəririk. (“C:\\\FromC\\myfile.txt”);
Ondan nəsə oxumaq üçün faylı açanda biz bir dəyişən kimi elan etdik char -
char s1
İndi etməmiz lazım olan tək şey dəyişənə fayldan sətirin dəyərini təyin etməkdir. Bunu komanda olaraq edirik in
Bucaq mötərizələrinə diqqət yetirin >> içərisində
Əslində, proqram koduna verilən şərhlərdən aydın olduğu kimi, dəyişənin oxunma dəyərini təyin etməsi üçün biz onu qeyd olunandan sonra yazmalıyıq. >> içərisində
>>s1-də;

Bu, xüsusilə çətin bir iş kimi görünmür, xüsusən də əvvəlki məqalədəki materialı mükəmməl mənimsəmiş və istifadə etməyi öyrənmisinizsə - hər şey tamamilə eynidir, yalnız 2 əmr fərqlidir

Faylın yaradılması və ona C++ məlumatının yazılması

axınından kənar həyata ( Fayl adı );
həyata<< (Yazılacaq sətir);
həyata.close();
=============================

C++ dilində fayldan mətnin oxunması və mətnin ekrana çap edilməsi

ifstream in (Fayl adı);
in>> (Xətti oxumaq);
in.close();(Faylı bağlayın)
============================
Klaviaturadan mətn daxiletməsini oxuyan və fayla yazan sadə proqram yazaq:

#daxildir
#daxildir

int main()
{
\\ 3 gələcək xətt
clrscsr(); // Ekranın təmizlənməsi

cout<<“Wwedi pervuu stroku” ; cin >>a ; endl;
cout<<“Wwedi wtoruu stroku” ; cin >>b ; endl;
cout<<“Wwedi tretuu stroku” ; cin >>c ; endl;
clrscr(); //

/*Faylla işləməyə başlayın*/
ofstream out (“C:\\\FromC\\myfile.txt”); //Yazmaq üçün faylın açılması
həyata<Birinci sətri yazın
həyata<İkinci sətri yazın
həyata<Üçüncü sətri yazın
out.close(); // Faylın bağlanması

//Dəyişənləri sıfıra sıfırlayın

üçün (int i =0;i<=255 ;i ++)
(a =*“” ; b =*“” ; c =*“” ;)


ifstream in (“C:\\\FromC\\myfile.txt”);
>>a >>b >>c-də; //Hər yeni sətri yeni dəyişənə oxuyuruq
in.close(); // Faylın bağlanması

/* */

üçün (i =0 ;a !=*“” ;i ++)
{
əgər (i >sizeof(a)) fasilə;
cout<

}
cout<<“\n” ; \\

/* */


{
əgər (i >sizeof(b)) fasilə;
cout<
}
cout<<“\n” ; \\ Kursoru yeni sətirə köçürün

/* */

üçün (i =0 ;с !=*“” ;i ++)
{
əgər (i >sizeof(c)) fasilə;
cout<<с ;
}

0 qaytarın;
}
===================

Yuxarıdakı nümunələrdə belə biri var BÖYÜK qüsur. Boşluqları ehtiva edən sətirə daxil olmağa çalışsaq, proqram bizə lazım olan kimi işləməyəcək. Yəqin ki, təkcə mən yox, bir çox başqa insanlar da bu xətaya rast gəliblər. Buna görə də, səhv kodu buraxıram ki, nə ilə qarşılaşa biləcəyinizi görə biləsiniz.

Evdə kitab olmadığından, mən yenidən İnterneti gəzməyə başladım və hər cür mürəkkəb cəfəngiyat tapdım. Amma nədənsə problemimin həllini tapdım.
Bunu oxumağım mənə kömək etdi coutüsullarını dəstəkləyir. İnternetdə bütün məsləhətlər funksiyadan istifadəyə yönəldilir getline Xoşbəxtlikdən bu funksiyadan necə istifadə edəcəyimi çox tez öyrəndim və sonra kodda istifadə etdim.
Ümumiyyətlə, bu funksiyanı qeyd etməyə və təsvir etməyə dəyər, amma hələ ki, mən bunu başa düşmürəm, sadəcə istifadə etmək lazım olduğunu başa düşürəm və necə başa düşürəm, ona görə də proqramımızın hazırlanmasına daha düzgün bir misal verim. :

#daxildir
#daxildir

int main()
{
char a,b,c; \\ 3 gələcək xətt
clrscsr(); // Ekranın təmizlənməsi

/* Dəyişənlər üçün dəyərlər daxil edin*/

cout<<“Wwedi pervuu stroku” ; cin.getline(a,sizeof(a)); endl;
cout<<“Wwedi wtoruu stroku” ; cin.getline(a,sizeof(b)); endl;
cout<<“Wwedi tretuu stroku” ; cin.getline(a,sizeof(c)); endl;
clrscr(); //Dəyərləri daxil etdikdən sonra ekran təmizləndi

/*Faylla işləməyə başlayın*/
ofstream out (“C:\\\FromC\\myfile.txt”); // Yazmaq üçün faylın açılması
həyata<
Birinci sətri yazın
həyata<İkinci sətri yazın
həyata<Üçüncü sətri yazın
out.close(); // Faylın bağlanması

//Dəyişənləri sıfıra sıfırlayın

üçün (int i =0;i<=255 ;i ++)
(a =*“” ; b =*“” ; c=*“” ;)

/*Faylla işləməyə davam edin*/

axın daxil olarsa (“C:\\\FromC\\myfile.txt”);
in.getline(a,sizeof(a));// A
in.getline(b,sizeof(b));// Dəyişənə sətri oxumaq b
in.getline(c,sizeof(c)); // Dəyişənə sətri oxumaq c
in.close(); // Faylın bağlanması

/* Birinci sətir simvolunu simvola görə oxuyuruq və ekranda göstəririk */

üçün (i =0 ;a !=*“” ;i++)
{
əgər (i >sizeof(a)) fasilə;
cout<

}
cout<<“\n” ; \\ Kursoru yeni sətirə köçürün

/* İkinci sətir simvolunu simvollara görə oxuyuruq və ekranda göstəririk */

üçün (i =0 ;b !=*“” ;i ++)
{
əgər (i >sizeof(b)) fasilə;
cout<
}
cout<<“\n” ; \\ Kursoru yeni sətirə köçürün

/* Üçüncü sətir simvolunu simvollara görə oxuyuruq və ekranda göstəririk */

üçün (i =0 ;с !=*“” ;i++)
{
əgər (i>sizeof (c )) fasilə;
cout<<с[i];
}

getch(); \\Enter düyməsinin basılmasını gözləyirik
0 qaytarın;
}
===================

Bu material məlumatın xarakter-xarakter oxunması nümunəsini təsvir edir. kimi dəyişənlərlə işləməyi təsvir etmədiyim üçün char, onda yeni başlayanlar kodu anlamaqda bəzi narahatlıqlarla üzləşə bilər. Sadəcə hansı növünü bilmirdim char bəzi xüsusiyyətləri var və hər şeyin daha sadə olduğunu düşünürdü. Buna görə də yuxarıdakı proqramın bəzi anlaşılmaz məqamlarını aşağıdakı məqalədə oxumaq olar char ilə işləmək V Başlayanlar üçün C++

Əks halda, C++ dilində mətn faylından sətirlərin oxunmasına dair verilmiş nümunə əlçatan və kifayət qədər başa düşülən olmalıdır. Bu, hazırda optimal tətbiq variantı deyil və mən bəzi vacib məqamları qaçırdım, lakin biz C++ dilini öyrənməyə başladığımız üçün bu, hələlik kifayətdir. Yəqin ki, sonradan qaçırdıqlarıma çatacağam, amma indi yalnız ən zəruri olanı dərk etməliyəm.

Əgər siz və mən bu materialı başa düşürüksə, deməli, peşəkarlığımıza doğru kiçik bir addım atmışıq.

Qeyd:
fasilə;– Bu, döngədən çıxan əmrdir. Dövr sayğacımız varsa üçün dəyişənin elan edilmiş ölçüsündən böyük olur char, sonra döngədən güclə çıxırıq
!= – Bu, qoyduğumuz şərtdir. Bu şərt bərabərsizliklə işarələnir
əgər(a!=b)– Sanki oxuyur a bərabər deyil b

endl; – Bu, kursoru konsolun içərisində yeni bir sətirə aparır (anladığım qədər)
Bu əmr buna bənzəyir “\n”

Mətn faylları

Nümunədən istifadə edərək C dilində mətn faylı ilə işləməyə baxaq. C diskində TextFile.txt adlı mətn faylı yaradın. Bu faylda aşağıdakı sətirləri yazın:

Sətir_1 123 Sətir_11, 456
Sim_2
Sim_3

Faylı yadda saxlayın.

Və bu, faylımızı açan və ondan sətirləri oxuyan C proqramının kodudur:

/* *Müəllif: @author Subbotin B.P..h> #include #define LEN 50 int main(void) ( puts("Mətn faylı əməliyyatları"); char cArray; FILE *pTextFile = fopen("C:\\TextFile.txt", "r"); if(pTextFile == NULL) ( puts("Problemlər"); return EXIT_FAILURE; ) while(fgets(cArray, LEN, pTextFile) != NULL) ( printf("%s", cArray); ) fclose(pTextFile EXIT_SUCCESS);

C-də mətn faylını açmaq üçün fopen funksiyasından istifadə edin:

FILE *pTextFile = fopen("C:\\TextFile.txt", "r");

Fopen funksiyasının birinci arqumenti fayla işarə edir, ikincisi isə faylın ondan oxumaq üçün açıq olduğunu bildirir.

Fgets funksiyasından istifadə edərək sətirləri oxuyuruq:

fgets(cArray, LEN, pTextFile);

fgets funksiyasının birinci arqumenti alınan sətirlərin saxlanacağı simvol massivinə işarə edir, ikinci arqument oxunacaq simvolların maksimum sayı, üçüncüsü isə bizim faylımızdır.

Faylla işi bitirdikdən sonra onu bağlamaq lazımdır:

fclose(pTextFile);

Biz əldə edirik:

Sətirlərdə rus hərfləri də görünür.

Yeri gəlmişkən, mən bu proqramı Eclipse-də etmişəm. Eclipse-də C/C++ ilə necə işləməyi görə bilərsiniz.

Beləliklə, mətn faylından məlumatları açdıq və oxuduq.

İndi gəlin proqramlı şəkildə mətn faylı yaratmağı və ona məlumat yazmağı öyrənək.

/* Müəllif: @author Subbotin B.P..h> #include int main(void) ( FILE *pTextFile = fopen("C:\\TextFileW.txt", "w"); char *cString = "Bu sətirdir"; char cNewLine = "\n"; int nVal = 123 if(pTextFile == NULL) ( puts("Problemlər"); return EXIT_FAILURE; ) fprintf(pTextFile, "%s%c", cString, cNewLine );

Məlumat yazmaq üçün mətn faylı yaradın:

FILE *pTextFile = fopen("C:\\TextFileW.txt", "w");

fayl artıq mövcuddursa, o, açılacaq və ondan bütün məlumatlar silinəcək.

C-string cString və nVal nömrəsi proqram tərəfindən mətn faylına yazılır. cNewLine sadəcə yeni bir xəttdir.

Fprintf funksiyasından istifadə edərək məlumatları mətn faylına yazırıq:

fprintf(pTextFile, "%s%c", cString, cNewLine);

burada birinci arqument bizim faylımızdır, ikincisi format sətridir, üçüncü və ya daha çox bu format üçün tələb olunan arqumentlərin sayıdır.

– bərabərliyi və ya bərabərsizliyi müəyyən etmək üçün müqayisə.

Sadalamanın praktiki məqsədi tam tipli fərqli simvolik sabitlər toplusunu müəyyən etməkdir.

Sadalanan dəyişənlərdən istifadə nümunəsi:

mo=1, tu, we, th, fr, sa, su ) günlər;

puts(“ Həftənin gününü daxil edin (1-dən 7-yə qədər): ”); scanf(“%d”, &t_gün);

w_day = su; başlanğıc = ay;

son = w_day -t_day;

printf(“\nBazar ertəsi həftənin %d günüdür, \indi isə %d gündür.\n\

Həftənin sonuna qədər %d gün (gün). ”, başlanğıc, t_gün, son);

Proqramın nəticəsi: Həftənin gününü daxil edin (1-dən 7-yə qədər): 2

Bazar ertəsi həftənin 1-ci günüdür, indi 2-ci gündür. Həftənin sonuna 5 gün (gün) qalıb.

18. C dilində fayllar

Fayl xarici daşıyıcıda yerləşən və emal zamanı vahid bütöv kimi qəbul edilən verilənlər toplusudur. Fayllar uzunmüddətli saxlama üçün nəzərdə tutulmuş məlumatları ehtiva edir.

İki növ fayl var: mətn və ikili. Mətn faylları ASCII simvollarının ardıcıllığıdır və istənilən mətn redaktorundan istifadə etməklə baxıla və redaktə edilə bilər.

Binar (ikili) fayllar strukturu proqram təminatı ilə müəyyən edilən verilənlər ardıcıllığıdır.

C dilində fayllarla işləmək üçün çoxlu funksiyalar dəsti var, onların əksəriyyəti stdio.h və io.h kitabxanalarında yerləşir.

18.1. Faylın açılması

Hər bir fayla daxili məntiqi ad verilir, sonradan ona daxil olduqda istifadə olunur. Məntiqi ad (fayl identifikatoru) dir

fayla göstərici, yəni. fayl haqqında bütün lazımi məlumatları ehtiva edən yaddaş sahəsinə. Fayl göstərici bəyannaməsi formatı aşağıdakı kimidir:

FILE * fayla göstərici;

FILE – standart kitabxanada təsvir edilən struktur tipi identifikatoru

stdio.h və aşağıdakı məlumatları ehtiva edir:

tip strukturu (

– buferdə qalan oxunmamış baytların sayı;

adi bufer ölçüsü 512 baytdır; səviyyə=0 olan kimi,

növbəti verilənlər bloku fayldan buferə oxunur;

– fayl statusu bayrağı – oxumaq, yazmaq, əlavə etmək;

– fayl deskriptoru, yəni. onun nömrəsini müəyyən edən nömrə

imzasız simvol saxlama;

– ötürülməmiş xarakter, yəni. ungetc-xarakteri;

– daxili ara tamponun ölçüsü;

işarəsiz simvol buferi;

– bufer daxilində giriş üçün göstərici dəyəri, yəni.

buferin başlanğıcını, xəttin başlanğıcını və ya cari dəyəri təyin edir

Rejimdən asılı olaraq bufer daxilində göstəricinin dəyəri

tamponlama;

imzasız char *curp;

– içəriyə daxil olmaq üçün göstəricinin cari dəyəri

fera, yəni. mübadilə buferindəki cari vəziyyəti müəyyən edir

proqramla;

imzasız istemp;

– müvəqqəti fayl bayrağı;

– faylla işləyərkən işarələmək;

) FILE;

Faylla işə başlamazdan əvvəl, yəni. Fayla məlumatı oxumaq və ya yaza bilmək üçün o, daxil olmaq üçün açılmalıdır. Bu məqsədlə adətən funksiyadan istifadə olunur

FILE* fopen(char* fayl_adı, char* rejimi);

o, xarici təsviri götürür - daşıyıcıda (disket, sərt disk) faylın fiziki adı və onu məntiqi adla uyğunlaşdırır.

Fiziki ad, yəni. fayl adı və ona gedən yol birinci parametrlə müəyyən edilir

– sətir, məsələn, “a:Mas_dat.dat” – disketdə yerləşən Mas_dat.dat adlı fayl, “d:\\work\\Sved.txt” – sabit diskdə yerləşən Sved.txt adlı fayl iş kataloqunda sürücü.

Diqqət! Xüsusi simvol kimi əks kəsik (\) sətirdə iki dəfə yazılır.

Uğurlu açıldıqdan sonra fopen funksiyası fayla göstərici qaytarır (bundan sonra fayl göstəricisi). Səhv olduqda, NULL qaytarılır. Bu vəziyyət adətən açılacaq faylın yolu səhv göstərildikdə baş verir. Məsələn, bizim universitetin displey sinfində yazmaq qadağan olunan yolu göstərsəniz (adətən d:\iş\ icazə verilir).

İkinci parametr fayla giriş rejimini təyin edən sətirdir:

w – fayl yazmaq üçün açılır; göstərilən adda fayl yoxdursa, o yaradılacaq; belə bir fayl varsa, əvvəlki məlumatlar açılmazdan əvvəl məhv edilir;

r – fayl yalnız oxumaq üçün açılır; belə bir fayl yoxdursa, səhv baş verir;

a – fayl sonuna yeni məlumat əlavə etmək üçün açılır;

r+ – fayl verilənləri redaktə etmək üçün açılır – həm məlumatın yazılması, həm də oxunması mümkündür;

w+ – r+ ilə eyni;

a+ – a üçün olduğu kimi, faylın istənilən yerində yalnız yazı yazmaq olar; faylın oxunması da mövcuddur;

t – fayl mətn rejimində açılır; b – fayl ikili rejimdə açılır;

Mətn rejimi binar rejimdən onunla fərqlənir ki, fayl mətn cütü “sətir axını” simvolları kimi açıldıqda, “karetkanın qaytarılması” bir simvolla əvəz olunur: fayla məlumat yazmaq üçün bütün funksiyalar üçün “sətir axını” və bütün çıxış funksiyaları üçün “xətt axını” simvolu indi iki simvolla əvəz olunur: “sətir axını”, “karetanın qaytarılması”.

Varsayılan olaraq, fayl mətn rejimində açılır. Nümunə: FILE *f; – f faylına göstərici elan edilir;

f = fopen("d:\\work\\Dat_sp.cpp", "w"); – iş kataloqunda d diskində yerləşən Dat_sp.cpp fiziki adına malik f məntiqi adlı fayl yazı üçün açılır; və ya daha qısa

FILE *f = fopen("d:\\work\\Dat_sp.cpp", "w");

18.2. Faylın bağlanması

Faylla işlədikdən sonra ona giriş bağlanmalıdır. Bunu int fclose (fayl göstəricisi) funksiyası yerinə yetirir. Məsələn, əvvəlki nümunədən fayl bu şəkildə bağlanır: fclose (f);

Çoxlu faylları bağlamaq üçün aşağıdakı kimi elan edilən funksiya təqdim edilir: void fcloseall (void);

Fayl üçün giriş rejimini dəyişdirmək lazımdırsa, əvvəlcə faylı bağlamalı və sonra onu yenidən açmalısınız, lakin fərqli giriş hüquqları ilə. Bunu etmək üçün standart funksiyadan istifadə edin:

FILE* açıq (char*fayl_adı, char *rejim, FILE *fayl_göstəricisi);

Bu funksiya əvvəlcə elan edilmiş faylı bağlayır fayl_göstəricisi(fopen funksiyası kimi) və sonra faylı fayl_adı və "rejim" icazələri ilə açır.

C dili yalnız proqram işləyərkən lazım olan müvəqqəti fayllarla işləmək qabiliyyətinə malikdir. Bu vəziyyətdə funksiyadan istifadə olunur

FILE* tmpfile (boş);

proqram tamamlandıqdan sonra və ya müvəqqəti fayl bağlandıqdan sonra “w+b” giriş hüquqları ilə diskdə müvəqqəti fayl yaradan, avtomatik olaraq silinir;

18.3. Yazın - məlumatı oxuyun

Fayla verilənlərin oxunması və yazılması üçün bütün hərəkətləri üç qrupa bölmək olar: simvol-xarakter daxil-çıxış əməliyyatları; xətt üzrə giriş/çıxış əməliyyatları; giriş/çıxış əməliyyatlarını bloklayın.

Bu üç əməliyyat qrupunun hər birində istifadə olunan əsas funksiyalara nəzər salaq.

Xarakter-xarakter I/O

Simvol-xarakter daxil/çıxış funksiyalarında fayldan bir simvol qəbul edilir və ya bir simvol fayla göndərilir:

Sıra I/O

Xətt I/O funksiyaları fayldan və ya fayldan ötürülür

Blok I/O

Blok I/O funksiyaları bütün bloklarda işləyir

məlumat:

int fread (boşluq*p, intsize,

– fayldan hər biri bayt ölçülü n blok oxuyur

int n, FILE *f)

la f p göstəricisi ilə yaddaş sahəsinə (tələb olunur

int fwrite (void*p, intsize,

oxunacaq blok üçün əvvəlcədən yaddaş ayırın);

– hər biri bayt ölçülü n blok yazır

int n, FILE *f)

f faylına p göstərici ilə yaddaş sahəsi.

Formatlaşdırılmış I/O funksiyalar tərəfindən istehsal olunur.

Son yenilənmə: 31/10/2015

Sinif Fayl axını fayldan oxumaq və fayla yazmaq imkanlarını təmsil edir. Bu həm mətn faylları, həm də ikili fayllarla işləməyə imkan verir.

Onun ən vacib xüsusiyyətlərini və üsullarını nəzərdən keçirək:

    Length xüsusiyyəti: axının uzunluğunu baytla qaytarır

    Mövqe xüsusiyyəti: axındakı cari vəziyyəti qaytarır

    Oxu metodu: Fayldan verilənləri bayt massivinə oxuyur. Üç parametr götürür: int Read(bayt massivi, int ofset, int sayı) və uğurla oxunan baytların sayını qaytarır. Burada aşağıdakı parametrlər istifadə olunur:

    • massiv - fayldan oxunan məlumatların yerləşdiriləcəyi bayt massivi

      ofset oxunmuş baytların yerləşdiriləcəyi massivdə baytlarla ofseti təmsil edir

      count - oxunacaq baytların maksimum sayı. Faylda daha az bayt varsa, onların hamısı oxunacaq.

    Metod long Seek(uzun ofset, SeekOrigin mənşəli): axınındakı mövqeyi ofset parametrində göstərilən baytların sayı ilə ofsetlə təyin edir.

    Yazma metodu: Bayt massivindən verilənləri fayla yazır. Üç parametr götürür: Yaz (bayt massivi, int ofset, int sayı)

    • massiv - verilənlərin fayla yazılacağı bayt massivi

      ofset - baytların axına yazılmağa başladığı massivdə baytlarla ofset

      count - yazılacaq baytların maksimum sayı

FileStream bayt səviyyəsində fayl girişini təmsil edir, ona görə də, məsələn, mətn faylına bir və ya bir neçə sətir oxumaq və ya yazmaq lazımdırsa, o zaman bayt massivi xüsusi metodlardan istifadə edərək sətirlərə çevrilməlidir. Buna görə də mətn faylları ilə işləmək üçün başqa siniflərdən istifadə olunur.

Eyni zamanda, müəyyən struktura malik olan müxtəlif ikili fayllarla işləyərkən, FileStream müəyyən informasiya hissələrini çıxarmaq və onları emal etmək üçün çox faydalı ola bilər.

Mətn faylının oxunması və yazılması nümunəsinə baxaq:

Console.WriteLine("Faya yazmaq üçün sətir daxil edin:"); sətir mətni = Console.ReadLine(); // istifadə edərək fayla yazın (FileStream fstream = new FileStream(@"C:\SomeDir\noname\note.txt", FileMode.OpenOrCreate)) ( // sətri bayt bayt massivinə çevirmək = System.Text.Encoding. Default. GetBytes(text); // fayla baytların yazılması.Write(massiv, 0, array.Length). fstream = Fayl OpenRead(@"C:\SomeDir\noname\note.txt")) ( // sətri baytlara çevirin bayt massivi = yeni bayt; // məlumatı oxuyun fstream.Read(massiv, 0, massiv. Length); // sətir üçün baytları deşifrə etmək textFromFile = System.Text.Encoding.Default.GetString(array) Console.WriteLine("Fayldan mətn: (0)", textFromFile ) Console.ReadLine();

Bu misala baxaq. Həm oxumaq, həm də yazmaq istifadə ifadəsindən istifadə edir. Bu ifadə kod faylının əvvəlində ad boşluqlarını ehtiva edən istifadə direktivi ilə qarışdırılmamalıdır. İstifadə ifadəsi kod blokunda obyekt yaratmağa imkan verir, başa çatdıqdan sonra həmin obyektin Dispose metodu çağırılır və bununla da obyekt məhv edilir. Bu halda fstream dəyişəni belə obyekt kimi xidmət edir.

fstream obyekti iki müxtəlif üsulla yaradılır: konstruktor vasitəsilə və File sinfinin statik metodlarından biri vasitəsilə.

Burada iki parametr konstruktora ötürülür: fayl yolu və FileMode nömrələməsi. Bu sadalama fayla giriş rejimini göstərir və aşağıdakı dəyərləri qəbul edə bilər:

    Əlavə et: əgər fayl varsa, mətn faylın sonuna əlavə olunur. Əgər fayl mövcud deyilsə, o yaradılmışdır. Fayl yalnız yazmaq üçün açılır.

    Yarat: Yeni fayl yaradılır. Əgər belə bir fayl artıq mövcuddursa, onun üzərinə yazılır

    CreateNew: Yeni fayl yaradılır. Əgər belə bir fayl artıq mövcuddursa, proqram xəta atır

    Aç: Faylı açır. Fayl mövcud deyilsə, istisna atılır

    OpenOrCreate: əgər fayl varsa açılır, yoxsa yenisi yaradılır

    Kəsmək: Əgər fayl varsa, onun üzərinə yazılır. Fayl yalnız yazmaq üçün açılır.

File sinfinin statik OpenRead metodu oxumaq üçün faylı açır və FileStream obyektini qaytarır.

FileStream sinif konstruktoru həmçinin yaradılan obyekti daha dəqiq fərdiləşdirməyə imkan verən bir sıra həddindən artıq yükləmələrə malikdir. Bütün bu versiyalara msdn-də baxmaq olar.

Həm yazmaq, həm də oxumaq System.Text ad məkanından Encoding.Default kodlaşdırma obyektindən istifadə edir. Bu halda biz onun iki metodundan istifadə edirik: sətirdən bayt massivi almaq üçün GetBytes və bayt massivindən sətir əldə etmək üçün GetString.

Nəticədə daxil etdiyimiz sətir fayla yazılır note.txt. Əslində, bu, ikili fayldır (mətn faylı deyil), baxmayaraq ki, ona yalnız bir sətir yazsaq, mətn redaktorunda açaraq bu faylı insan oxuya bilən formada görə bilərik. Bununla belə, ona təsadüfi bayt yazsaq, məsələn:

Fstream.WriteByte(13); fstream.WriteByte(103);

O zaman onu anlamaqda problem yaşaya bilərik. Buna görə də, ayrı-ayrı siniflər birbaşa mətn faylları ilə işləmək üçün nəzərdə tutulmuşdur - StreamReader və StreamWriter.

Fayllara təsadüfi giriş

Çox vaxt ikili fayllar müəyyən bir quruluşu təmsil edir. Və bu strukturu bilməklə biz fayldan lazımi məlumatı götürə və ya əksinə faylın müəyyən yerinə müəyyən bayt dəstini yaza bilərik. Məsələn, wav fayllarında audio verilənlərin özü 44 baytdan başlayır və 44 bayta qədər müxtəlif metadata var - audio kanalların sayı, seçmə tezliyi və s.

Seek() metodundan istifadə edərək, faylın oxunması və ya yazılmasının yerinə yetirildiyi axın kursorunun mövqeyini idarə edə bilərik. Bu üsul iki parametr götürür: ofset və fayldakı mövqe. Fayldakı mövqe üç dəyərlə təsvir olunur:

    SeekOrigin.Begin : faylın başlanğıcı

    SeekOrigin.End : faylın sonu

    SeekOrigin.Current : fayldakı cari mövqe

Oxumanın və ya yazının başlandığı axının kursoru ikinci parametr kimi göstərilən mövqeyə nisbətən ofsetlə irəli çəkilir. Ofset mənfi ola bilər, sonra kursor geriyə, müsbət olarsa, irəliyə doğru hərəkət edir.

Bir misala baxaq:

System.IO-dan istifadə; System.Text istifadə edərək; sinif Proqramı ( statik void Main(string args) ( string text = "salam dünya"; // fayla yazmaq (FileStream fstream = new FileStream(@"D:\note.dat", FileMode.OpenOrCreate)) ( / / sətri bayta çevirin giriş = Encoding.Default.GetBytes(mətn); // fayla bayt massivi yazın fstream.Write(input, 0, input.WriteLine("Mətn fayla yazılır"); ); göstəricini faylın sonuna, beş baytı faylın sonuna aparın cari mövqe bayt çıxışı = yeni bayt(çıxış, 0, çıxış.Length); // baytları sətirdə deşifrə etmək textFromFile = Encoding.Default.GetString(çıxış: Fayldan mətn: (0)); , textFromFile); faylda söz dünyası söz evi sətrinə dəyişdirinText = "ev"; GetBytes(replaceText , 0, input.Length);

// bütün faylı oxuyun // göstəricini faylın əvvəlinə qaytarın fstream.Seek(0, SeekOrigin.Begin);

çıxış = yeni bayt;

fstream.Read(çıxış, 0, çıxış.Length);

// baytları sətirdə deşifrə edin textFromFile = Encoding.Default.GetString(çıxış);

Console.WriteLine("Fayldan mətn: (0)", textFromFile); // salam ev ) Console.Read();

) )

Konsol çıxışı:

Fayla yazılmış mətn Fayldan mətn: dünya Fayldan mətn: salam ev

FileStream fstream = null; cəhd edin ( fstream = new FileStream(@"D:\note3.dat", FileMode.OpenOrCreate); // axınla əməliyyatlar ) catch(Exception ex) ( ) sonunda ( if (fstream != null) fstream.Close() )

Əgər istifadə konstruksiyasından istifadə etməsək, o zaman biz açıq şəkildə Close() metodunu çağırmalıyıq: fstream.Close()

tərəfindən hazırlanmış I/O mexanizmi bu gün obyekt yönümlü proqramlaşdırmanın ümumi qəbul edilmiş üslubuna uyğun gəlmir, əlavə olaraq, müasir təhlükəsiz kod icra mühitlərində potensial olaraq təhlükəli hesab edilən göstərici əməliyyatlarından çox istifadə edir. Tətbiq proqramlarını inkişaf etdirərkən alternativ C++ dil standartı ilə təmin edilən standart I/O siniflərinin mexanizmidir.

Faylların açılması

Ən çox istifadə olunan siniflər oxumaq üçün ifstream, yazmaq üçün ofstream və faylları dəyişdirmək üçün fstream sinifləridir.

Bütün yivli I/O sinifləri dolayı yolla ümumi əcdad ios-dan əldə edilir və onun funksionallığını tam miras alır. Beləliklə, faylın açılması rejimi sadalanan tipli open_mode məlumat üzvü tərəfindən müəyyən edilir və bu aşağıdakı kimi müəyyən edilir:

Enum open_rejimi ( proqram, binar, daxil, çıxış, trunc, yedi);

Aşağıda bayraqların mümkün dəyərləri və məqsədi verilmişdir.

Məsələn, ikili formada məlumatları oxumaq üçün test.txt adlı faylı açmaq üçün aşağıdakıları yazmalısınız:

ifstream faylı; file.open("test.txt", ios::in | ios::binary);

Məntiqi OR operatoru (|) bayraqların istənilən kombinasiyası ilə rejim yaratmağa imkan verir. Beləliklə, faylı girişlə açarkən təsadüfən eyni adlı mövcud faylın üzərinə yazmamaq üçün aşağıdakı formadan istifadə etməlisiniz:

Ofstream faylı; file.open("test.txt", ios::out | ios::app);

Müvafiq başlıq faylının layihəyə daxil edildiyi güman edilir:

#daxildir

Faylın uğurla açılıb-açılmadığını yoxlamaq üçün konstruksiyadan istifadə edə bilərsiniz

Əgər (!fayl) ( //Faylın açılması xətası)

Daxiletmə və çıxarma operatorları

Faylların işlənməsi siniflərində ləğv edilib daxiletmə operatoru (<<) записывает данные в файловый поток. Как только вы открыли файл для записи, можно записывать в него текстовую строку целиком:

Fayl<< "Это строка текста";

Siz həmçinin hissələrə mətn sətri yaza bilərsiniz:

Fayl<< "Это " << "строка " << "текста";

endl ifadəsi sətir girişini karetin qaytarılması ilə bitirir:

Fayl<< "Это строка текста" << endl;

Daxiletmə operatorundan istifadə edərək dəyişənlərin və ya massiv elementlərinin qiymətlərini fayla yazmaq asandır:

Ofstream faylı ("Temp.txt"); char buff = "Mətn massivində dəyişənlər var"; int vx = 100; float pi = 3.14159; fayl<< buff << endl << vx << endl << pi << endl;

Kodun icrası nəticəsində Temp.txt mətn faylının üç sətri əmələ gəlir:

Mətn massivi 100 3.14159 dəyişənlərini ehtiva edir

Qeyd edək ki, rəqəmli dəyərlər fayla ikili dəyərlər deyil, mətn sətirləri kimi yazılır.

Axtarış operatoru(>>) əks effekt verir. Belə görünür ki, əvvəllər yazılmış Temp.txt faylından simvol çıxarmaq üçün aşağıdakı kimi kod yazmalısınız:

Ifstream faylı ("Temp.txt"); char buff; int vx; float pi; fayl >> buff >> vx >> pi;

Bununla belə, çıxarma operatoru qarşılaşdığı ilk ayırıcıda (boşluq, tab və ya yeni sətir) dayanacaq. Beləliklə, “Mətn massivində dəyişənlər var” cümləsini təhlil edərkən buff massivinə yalnız “Mətn” sözü yazılacaq, boşluq nəzərə alınmayacaq və “massiv” sözü bütün vx dəyişəninin dəyərinə çevriləcək və kod icra məlumat strukturunun qaçınılmaz pozulması ilə "çalışacaq". Sonra, ifstream sinfini müzakirə edərkən, əvvəlki nümunədən faylın oxunmasını necə düzgün təşkil edəcəyimizi göstərəcəyik.

ifstream sinfi: faylları oxumaq

Adından göründüyü kimi ifstream sinfi fayl axını daxil etmək üçün nəzərdə tutulub. Sinfin əsas üsulları aşağıda verilmişdir. Onların əksəriyyəti istream sinifindən miras alınmışdır və ana funksionallığı genişləndirmək üçün həddən artıq yüklənmişdir. Məsələn, get funksiyası zəng parametrindən asılı olaraq təkcə bir simvolu deyil, həm də simvollar blokunu oxuya bilər.

İndi əvvəlki nümunənin necə dəyişdirilməsi lazım olduğu aydın oldu ki, məlumatların çıxarılması operatorundan istifadə gözlənilən nəticəni versin:

Ifstream faylı ("Temp.txt"); char buff; int vx; float pi; file.getline(buff, sizeof(buff)); fayl >> vx >> pi:

Getline metodu faylın birinci sətrini sona qədər oxuyacaq və >> operatoru dəyişənlərə qiymətlər təyin edəcək.

Aşağıdakı nümunə mətn faylına verilənlərin əlavə edilməsini və sonra bütün faylın oxunmasını göstərir. -də müzakirə edilən səbəblərə görə while(!file2.eof()) əvəzinə while(1) döngəsi istifadə olunur.

#daxildir #daxildir ad sahəsi std istifadə edərək; int main() ( axın faylı; file.open("test.txt",ios::out|ios::app); əgər (!fayl) ( 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 >>a;<< a << " "; k++; } cout << endl << "K=" << k << endl; file2.close(); cin.sync(); cin.get(); return 0; }

əgər (file2.eof()) pozulur;

#daxildir #daxildir cout<< str << endl; // вывод прочитанной строки на экран cin.sync(); cin.get(); return 0; }

Windows OS-də bu kod faylın son sətirində yeni sətir simvolunun olmasından da asılıdır, bunu etmək daha etibarlı olardı;

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

Açıq və qapalı üsullara açıq zənglər tələb olunmur. Həqiqətən, konstruktoru arqumentlə çağırmaq, yivli fayl obyektini yaratma anında faylı dərhal açmağa imkan verir:

Ifstream faylı("test.txt");

Bağlama metodunun əvəzinə, fayl obyektinin dağıdıcısını avtomatik çağıracaq və faylı bağlayan silmə operatorundan istifadə edə bilərsiniz. while loop kodu faylın sonunun düzgün yoxlanılmasını təmin edir.

ofstream sinfi: faylların yazılması

Ofstream sinfi fayl axınından məlumatları çıxarmaq üçün nəzərdə tutulmuşdur. Aşağıda bu sinfin əsas üsulları sadalanır.

Daha əvvəl təsvir edilən daxiletmə operatoru mətn faylına yazmağı təşkil etmək üçün əlverişlidir:

Ofstream faylı("temp.txt"); əgər (!fayl) qaytarılırsa; üçün (int i=1; i<=3; i++) file << "Строка " << i << endl; file.close();

Binar fayllar

Prinsipcə, ikili verilənlər mətn məlumatları kimi qəbul edilir. Fərq ondadır ki, əgər binar verilənlər konkret məntiqi strukturda yazılıbsa, o zaman fayldan eyni struktur tipli dəyişənə oxunmalıdır.

Yazma və oxuma üsullarının birinci parametri (yazma/oxuma blokunun ünvanı) simvol göstərici tipində olmalıdır char * , ona görə də boş * strukturunun ünvan tipinin açıq şəkildə çevrilməsini həyata keçirmək lazımdır. İkinci parametr faylın ikili bloklarının faktiki qeyd uzunluğundan asılı olmayaraq sabit bayt ölçüsünə malik olduğunu müəyyən edir. Aşağıdakı proqram sadə notebookda məlumatların yaradılması və göstərilməsi nümunəsini təqdim edir. Sonra fayl qeydləri ardıcıl oxunur və konsolda göstərilir.

#daxildir #daxildir #daxildir ad sahəsi std istifadə edərək; struct Qeydlər ( // notebook məlumat strukturu char Adı; // tam adı char Telefon; // telefon int Yaş; // yaş ); int main() ( setlocale(LC_ALL, "Rus"); Qeydlər Qeyd1= ("Qorxunc İoan Vasilyeviç", "quraşdırılmayıb", 60); Qeydlər Note2= ("Qodunov Boris Fedoroviç", "095-111-2233" , 30 ); sizeof (Qeydlər)); // 1-ci blok ofile.write((char*)&Note2, sizeof(Notes)); // 2-ci blok ofile.write((char*)&Note3, sizeof(Qeydlər)); .close(); // qeydə alınmış faylı bağlayın ifstream ifile("Notebook.dat", ios::binary); // static string bufer // eof olana qədər sətirləri oxuyun (!ifile.read((char*)&Note, sizeof(Notes)).eof()) ( sprintf(str, "%s\tPhone: %s\tAge: %d" , Note.Name, Note.Phone, Qeyd.Yaş);<< str << endl; } ifile.close(); // закрыть прочитанный файл cin.sync(); cin.get(); return 0; }

Bu kodun icrası nəticəsində hər biri 80 bayt olan üç blokdan (simvolların bir baytlıq olduğunu nəzərə alsaq) Notebook.dat binar faylı formalaşır. Təbii ki, digər yivləmə üsullarından istifadə edə və müəyyən bir məlumat strukturunun sahələrində istənilən əməliyyatları yerinə yetirə bilərsiniz.

fstream sinfi: təsadüfi fayl girişi

Tutaq ki, dəftərimizdə 100 qeyd var və biz 50-ni saymaq istəyirik. Əlbəttə ki, bir döngə təşkil edə və birincidən verilənə qədər bütün qeydləri oxuya bilərsiniz. Aydındır ki, daha məqsədyönlü həll pos faylı mövqeyi göstəricisini birbaşa 50 girişinə təyin etmək və ondan oxumaqdır:

Ifstream ifile("Notebook.dat", ios::binary); int pos = 49 * sizeof(Qeydlər); ifile.seekg(pos); // 50th Notes Note girişini axtarın;

//Qeydlər – yuxarıda təsvir edilən “qeyd” strukturu ifile.read((char*)&Note, sizeof(Notes));

Bu cür axtarış əməliyyatları o zaman effektiv olur ki, fayl məlum və sabit ölçülü qeydlərdən ibarətdir. İxtiyari qeydin məzmununu əvəz etmək üçün modifikasiya rejimində çıxış axını açmalısınız:

Ofstream ofile ("Notebook.dat", ios::binary | ios::ate); int pos = 49 * sizeof(Qeydlər); ofile seekp(pos); // 50-ci qeydi axtar Notes Note50 = (“Yeltsin Boris Nikolaevich”, “095-222-3322”, 64); ofile.write((char*)&Qeyd, sizeof(Qeydlər)); // əvəz

Nəhayət, fstream axın sinfinin sələflərindən miras qalmış üsullardan istifadə edərək oxumaq/yazmaq üçün faylı eyni vaxtda açmaq mümkündür. fstream sinfi istream və ostream-dən (müvafiq olaraq ifstream və ofstream-in valideynləri) əldə edildiyi üçün əvvəllər qeyd olunan bütün üsullar tətbiqdə əlçatan olur.

Aşağıdakı nümunə Notebook.dat faylında birinci və üçüncü qeydlərin yenidən təşkilini göstərir.

#daxildir #daxildir #daxildir ad sahəsi std istifadə edərək; struct Qeydlər (char Adı; char Telefon; int Age; ); int main() ( setlocale(LC_ALL, "Rus"); Qeydlər Qeyd1, Qeyd3; // Eyni zamanda oxumaq/yazmaq üçün faylı açın fstream faylı("Notebook.dat", ios::binary | ios::in | ios: : out file.seekg(2 * sizeof(Notes)); // Note3 faylını tapın.read((char*)&Note3, sizeof(Qeydlər) // Note1 faylını tapın və oxuyun ((char *)&Qeyd1, sizeof(Qeydlər) faylı.seekg(0);<== 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; }

Fayl obyektinin konstruktorunda eyni vaxtda oxumaq və yazma əməliyyatlarına imkan verən ios::in və ios::out bayraqlarını təyin etməlisiniz. Bu kodun icrası nəticəsində Notebook.dat binar faylında birinci və üçüncü qeydlər dəyişdiriləcək.

Mövzu ilə bağlı əlavə nümunələr var.