Lezen uit een C-bestand. Invoer vanuit bestand en uitvoer naar bestand

Informatie vastleggen in tekstbestand wij hebben het al geleerd. – Als je nog niet hebt geleerd hoe, zie dan het vorige artikel. Het wordt uitvoerig verteld en beschreven

Maar wat als het bestand al bestaat en we er informatie uit moeten lezen voor verwerking? Gelukkig is dit ook heel eenvoudig. Ik wil u eraan herinneren dat er verschillende opties zijn om deze taak uit te voeren; ik heb er slechts één beschreven. De beschreven versie is degene die mij om een ​​of andere reden persoonlijk het gemakkelijkst te begrijpen lijkt.

#erbij betrekken

int hoofd()
{
teken s1 //De variabele leest de string
ifstream in (“C:\\\FromC\\mijnbestand.txt” ); //Open het bestand om informatie te lezen
in >>s1; //lees de regel
in.close() // Het bestand sluiten

uit<Voer de waarde uit s1 naar het scherm
retour 0;
}

Hier is het eenvoudigste programma om de eerste regel van een tekstbestand langs het pad te lezen
C:\\\FromC\\mijnbestand.txt –
Omdat dit een voortzetting is van het vorige artikel, heb ik besloten het bestand te gebruiken dat we daar hebben gemaakt. Hier zouden waarschijnlijk geen problemen mee moeten zijn.
Maar laten we teruggaan naar de code. Eerst openen we het bestand om er informatie uit te lezen, hiervoor gebruiken we het commando alsstroom tussen haakjes geven we de bestandsnaam of het pad naar het bestand aan, zoals ik deed. (“C:\\\FromC\\mijnbestand.txt” );
Toen we een bestand openden om er iets uit te lezen, declareerden we één variabele zoals verkoold –
teken s1
Nu hoeven we alleen nog maar aan de variabele de waarde van de string uit het bestand toe te kennen. Wij doen dit als team in
Let op de hoekbeugels op >>
Eigenlijk, zoals duidelijk zou moeten zijn uit de opmerkingen bij de programmacode, moeten we, voordat de variabele de leeswaarde kan toekennen, deze daarna schrijven op >>
in >>s1;

Niets bijzonders uitdagende taak dit lijkt niet mogelijk, vooral als je het materiaal uit het vorige artikel al perfect onder de knie hebt en hebt leren gebruiken - alles is absoluut hetzelfde, alleen 2 commando's zijn anders

Een bestand maken en C++-informatie ernaar schrijven

vanstroom uit ( Bestandsnaam );
uit<< (Tekenreeks die moet worden geschreven);
uit.dichtbij();
=============================

Tekst uit een bestand lezen en tekst naar het scherm afdrukken in C++

alsstroom in (Bestandsnaam);
in>> (Het lezen van de lijn);
in.dichtbij();(Sluit het bestand)
============================
Laten we schrijven een eenvoudig programma, die de toetsenbordtekstinvoer leest en naar een bestand schrijft:

#erbij betrekken
#erbij betrekken

int hoofd()
{
\\ 3 toekomstige lijnen
clrscsr(); // Het scherm leegmaken

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

/*Begin met werken met het bestand*/
ofstream out (“C:\\\FromC\\mijnbestand.txt” ); //Een bestand openen om te schrijven
uit<Schrijf de eerste regel op
uit<Schrijf de tweede regel
uit<Schrijf de derde regel op
uit.close(); // Het bestand sluiten

// Variabelen opnieuw instellen

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


ifstream in (“C:\\\FromC\\mijnbestand.txt” );
in >>a >>b >>c ; //We lezen elke nieuwe regel in een nieuwe variabele
in.sluiten(); // Het bestand sluiten

/* */

voor (i =0 ;a !=*“” ;i ++)
{
als (i >groottevan(a)) pauze ;
uit<

}
uit<<“\n” ; \\

/* */


{
als (i >groottevan(b)) pauze ;
uit<
}
uit<<“\n” ; \\ Verplaatst de cursor naar een nieuwe regel

/* */

voor (i =0 ;с !=*“” ;i ++)
{
als (i >groottevan(c)) pauze ;
uit<<с ;
}

retour 0;
}
===================

In de bovenstaande voorbeelden is er zo één ENORM gebrek. Als we proberen een regel met spaties in te voeren, werkt het programma niet zoals nodig. Waarschijnlijk kwam niet alleen ik, maar ook veel andere mensen deze fout tegen. Daarom laat ik de verkeerde code achter, zodat je kunt zien wat je tegenkomt.

Omdat er thuis geen boeken zijn, begon ik opnieuw op internet te zoeken en vond ik allerlei soorten verfijnde onzin. Maar op de een of andere manier heb ik een oplossing voor mijn probleem gevonden.
Het hielp dat ik dat las uit ondersteunt zijn methoden. En op internet gaat al het advies naar het gebruik van de functie lijn krijgen Gelukkig voor mij ontdekte ik heel snel hoe ik deze functie moest gebruiken en gebruikte ik deze vervolgens in de code.
Over het algemeen is het de moeite waard om deze functie te vermelden en te beschrijven, maar tot nu toe begrijp ik het niet echt, ik begrijp alleen dat het gebruikt moet worden en ik begrijp hoe, dus ik zal een correcter voorbeeld geven van ons programma dat wordt ontwikkeld :

#erbij betrekken
#erbij betrekken

int hoofd()
{
teken a,b,c; \\ 3 toekomstige lijnen
clrscsr(); // Het scherm leegmaken

/* Voer waarden in voor variabelen*/

uit<<“Wwedi pervuu stroku” ; cin.getline(a,groottevan(a)); eind;
uit<<“Wwedi wtoruu stroku” ; cin.getline(a,groottevan(b)); eind;
uit<<“Wwedi tretuu stroku” ; cin.getline(a,groottevan(c)); eind;
clrscr(); //Na het invoeren van de waarden werd het scherm gewist

/*Begin met werken met het bestand*/
ofstream out (“C:\\\FromC\\mijnbestand.txt”); // Een bestand openen om te schrijven
uit<
Schrijf de eerste regel op
uit<Schrijf de tweede regel
uit<Schrijf de derde regel op
uit.close(); // Het bestand sluiten

// Variabelen opnieuw instellen

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

/*Ga door met werken met het bestand*/

als streamen (“C:\\\FromC\\mijnbestand.txt” );
in.getline(a,groottevan(a));// A
in.getline(b,groottevan(b));// Een regel in een variabele lezen B
in.getline(c,groottevan(c)); // Een regel in een variabele lezen C
in.sluiten(); // Het bestand sluiten

/* We lezen de eerste regel karakter voor karakter en geven deze weer op het scherm */

voor (i =0 ;a !=*“” ;i++)
{
als (i >groottevan(a)) pauze ;
uit<

}
uit<<“\n” ; \\ Verplaatst de cursor naar een nieuwe regel

/* We lezen de tweede regel karakter voor karakter en geven deze weer op het scherm */

voor (i =0 ;b !=*“” ;i ++)
{
als (i >groottevan(b)) pauze ;
uit<
}
uit<<“\n” ; \\ Verplaatst de cursor naar een nieuwe regel

/* We lezen de derde regel karakter voor karakter en geven deze weer op het scherm */

voor (i =0 ;с !=*“” ;i++)
{
als (i>groottevan (c)) pauze ;
uit<<с[i];
}

haal(); \\Wachten tot de Enter-toets wordt ingedrukt
retour 0;
}
===================

Dit materiaal beschrijft een voorbeeld van het karakter voor karakter lezen van informatie. Omdat ik het werken met variabelen zoals verkoold, dan kunnen beginners enig ongemak ondervinden bij het begrijpen van de code. Ik wist alleen niet welk type verkoold heeft enkele eigenaardigheden en dacht dat alles eenvoudiger was. Daarom zijn enkele onbegrijpelijke momenten uit het bovenstaande programma te lezen in het volgende artikel werken met Char V C++ voor beginners

Anders zou het gegeven voorbeeld van het lezen van regels uit een tekstbestand in C++ toegankelijk en redelijk begrijpelijk moeten zijn. Dit is op dit moment niet de optimale implementatieoptie en ik heb een aantal belangrijke punten gemist, maar aangezien we de taal C++ beginnen te leren, is dit voor nu voldoende. Later zal ik waarschijnlijk terugkomen op wat ik heb gemist, maar nu hoef ik alleen het meest noodzakelijke waar te nemen.

Als u en ik dit materiaal begrijpen, betekent dit dat we een kleine stap in de richting van onze professionaliteit hebben gezet.

Opmerking:
pauze ;– Dit is het commando dat de lus verlaat. We hebben de cyclusteller voor groter wordt dan de aangegeven grootte van de variabele Char, dan verlaten we met geweld de lus
!= – Dit is de voorwaarde die wij stellen. Deze toestand wordt aangeduid met ongelijkheid
als(een !=b)– Leest alsof A niet gelijk B

eind; – Dit is om de cursor naar een nieuwe regel in de console te verplaatsen (voor zover ik het begrijp)
Deze opdracht is vergelijkbaar met "\N"

In deze sectie worden twee manieren besproken om met bestanden en de standaard MFC CFileDialog-klasse te werken.


1. Werken met bestanden in C (werkt ook in C++)..


    #erbij betrekken
    #erbij betrekken

Leegte belangrijkste (leegte)
{
BESTAND *bestand;
char* bestandsnaam = "bestand.txt";
char load_string = "geen";

Bestand = fopen(bestandsnaam, "w");

Fputs("tekenreeks", bestand);

Bestand = fopen(bestandsnaam, "r");
als(bestand != 0)
{
fgets(laad_string, 50, bestand);
schelden)
anders
{
schelden)
fsluiten(bestand);
) Beschrijvingen van functies voor het werken met bestanden bevinden zich in de bibliotheek stdio.h
Eerst moet u een verwijzing maken naar een variabele van het type FILE ( BESTAND* bestand;).
Het openen van een bestand gebeurt door het aanroepen van de fopen-functie ( bestand = fopen(bestandsnaam, "w");)
De eerste parameter van deze functie is de bestandsnaam, de tweede geeft aan in welke modus het bestand geopend moet worden. "w"- geopend voor opname, "R"- geopend om te lezen, "A"- bestandstoevoeging (dit zijn de meest gebruikte modi, hoewel er andere zijn). Het schrijven en lezen van gegevens uit een bestand wordt uitgevoerd door de volgende functies: fputc, fputs, fgetc, fgets, fprintf, fscanf(voor een beschrijving van deze functies, zie stdio.h).
Het sluiten van een bestand doe je door de functie fclose ( fsluiten(bestand);).

Werken met bestanden met behulp van MFC (klassen CFile, CStdioFile, ...) en de standaard MFC-klasse CFileDialog.


De MFC-bibliotheek bevat verschillende klassen voor het werken met bestanden. De hieronder besproken klassen erven van de basisklasse

CBestand.

Klasse CF-ile

CBestandontworpen om met bestanden te werken. Het maakt bestanden eenvoudiger te gebruiken door een bestand voor te stellen als een object dat kan worden gemaakt, gelezen, geschreven, enz.

Om toegang te krijgen tot een bestand, moet u eerst een object van de klasse CFile maken. Met de klasseconstructor kunt u een bestand onmiddellijk openen nadat u een dergelijk object hebt gemaakt. Maar u kunt het bestand later openen met behulp van de methode

Open.

Bestanden openen en maken

Na het maken van het klasseobject CBestandu kunt een bestand openen door de methode aan te roepenOpen. De methode moet het pad naar het te openen bestand en de gebruiksmodus specificeren. Methode prototypeOpenheeft de volgende vorm:

Virtuele BOOL Open(LPCTSTR lpszFileName, UINT nOpenFlags, CFileException* pError=NULL);

Als parameter lpszFileName moet u de naam opgeven van het bestand dat u wilt openen. U kunt alleen de bestandsnaam opgeven of de volledige bestandsnaam, inclusief het volledige pad ernaartoe.

De tweede parameter, nOpenFlags, specificeert de actie die de Open-methode op het bestand uitvoert, evenals de kenmerken van het bestand. Hieronder staan ​​enkele mogelijke waarden voor de parameter nOpenFlags:

  • CFile::modeCreate - Maakt een nieuw bestand. Als het opgegeven bestand bestaat, wordt de inhoud ervan gewist en wordt de bestandslengte op nul gezet.
  • CFile::modeNoTruncate - Dit bestand is bedoeld om te worden gebruikt in combinatie met het bestand CFile::modeCreate. Als een bestaand bestand wordt aangemaakt, wordt de inhoud ervan niet verwijderd.

  • CFile::modeRea d - Het bestand wordt alleen-lezen geopend.
  • CFile::modeReadWrite - Het bestand wordt geopend voor schrijven en lezen.
  • CFile::modeWrite - Het bestand wordt alleen geopend om te schrijven.
  • CFile::typeText - Wordt gebruikt door klassen die zijn afgeleid van de klasse CFile, zoals CStdioFile, om met bestanden in de tekstmodus te werken. De tekstmodus converteert de combinatie van een regelterugloopteken en een regelinvoerteken.
  • CFile::Binary - Wordt gebruikt door klassen die zijn afgeleid van de CFile-klasse, zoals CStdioFile, om met bestanden in binaire modus te werken.
  • Optionele parameter pError, die een verwijzing is naar een klasseobject CFileException, wordt alleen gebruikt als het uitvoeren van een bewerking op het bestand een fout zou veroorzaken. In dit geval wordt aanvullende informatie naar het object geschreven waarnaar pError verwijst.

    Methode Openretourneert niet-nul als het bestand open is en nul bij een fout. Er kan een fout optreden bij het openen van een bestand, bijvoorbeeld als de Open-methode is opgegeven om een ​​niet-bestaand bestand te lezen.

    Bestands-ID openen

    De klasse CFile bevat een data-element m_hFile van het type UINT. Het slaat de identificatie van het geopende bestand op. Als er al een object van de klasse CFile is gemaakt, maar het bestand nog niet is geopend, wordt de constante hFileNull in de variabele m_hFile geschreven.

    Normaal gesproken wordt de open-bestands-ID niet rechtstreeks gebruikt. Klasse methoden CBestandkunt u vrijwel elke bewerking met bestanden uitvoeren en hoeft u geen bestands-ID op te geven. Omdat m_hFile een klasse-element is, heeft de implementatie van zijn methoden er altijd vrije toegang toe.

    Bestanden sluiten

    Nadat u klaar bent met het werken met het bestand, moet het worden gesloten. Klas CBestandheeft hiervoor een speciale Sluitingsmethode. Opgemerkt moet worden dat als een object van de klasse CFile is gemaakt en een bestand is geopend en het object vervolgens wordt verwijderd, het bijbehorende bestand automatisch wordt gesloten met behulp van een destructor.

    Bestanden lezen en schrijven

    Er zijn verschillende klassenmethoden voor toegang tot bestanden. CBestand: Lezen, lezengroot, schrijven, schrijvengroot, doorspoelen. Methoden Lezen en lezenGroot zijn ontworpen om gegevens uit een eerder geopend bestand te lezen. Op 32-bits besturingssystemen kunnen beide methoden tegelijkertijd meer dan 65535 bytes uit een bestand lezen. De ReadHuge-specificatie wordt als verouderd beschouwd en wordt alleen behouden voor compatibiliteit met 16-bits besturingssystemen.

    Gegevens die uit het bestand worden gelezen, worden naar de lpBuf-buffer geschreven. De parameter nCount specificeert het aantal bytes dat uit het bestand moet worden gelezen. In feite kunnen er minder bytes uit het bestand worden gelezen dan gevraagd door de parameter nCount. Dit gebeurt als het einde van het bestand tijdens het lezen wordt bereikt. De methoden retourneren het aantal bytes dat uit het bestand is gelezen.

    De methoden Write en WriteHuge zijn bedoeld voor het schrijven naar een bestand. Op 32-bits besturingssystemen kunnen beide methoden tegelijkertijd meer dan 65535 bytes naar een bestand schrijven. Methods schrijft bytes uit de lpBuf-buffer naar het geopende bestand nCount. Als er een schrijffout optreedt, zoals een schijf die vol is, wordt er door de methoden een beroep gedaan op de afhandeling van uitzonderingen.

    Spoelmethode

    Wanneer de Write- of WriteHuge-methode wordt gebruikt om gegevens naar schijf te schrijven, kan deze enige tijd in een tijdelijke buffer blijven. Om ervoor te zorgen dat de noodzakelijke wijzigingen in het bestand op schijf worden aangebracht, moet u de Flush-methode gebruiken.

    Bestandsbewerkingen

    De klasse bevat methoden waarmee u verschillende bewerkingen op bestanden kunt uitvoeren, zoals kopiëren, hernoemen, verwijderen en attributen wijzigen.

    Om de bestandsnaam te wijzigen, bevat de klasse CFile een statische methode Hernoemen, die de functies van deze opdracht uitvoert. De methode kan niet worden gebruikt om mappen te hernoemen. Als er een fout optreedt, genereert de methode een uitzondering.

    In de klasse CFile is een statische methode opgenomen om bestanden te verwijderen Verwijderen, waarmee u het opgegeven bestand kunt verwijderen. Met deze methode kunt u geen mappen verwijderen. Als het bestand niet kan worden verwijderd, genereert de methode een uitzondering.

    Om de datum en tijd van het aanmaken van bestanden, de lengte en attributen ervan te bepalen, wordt een statische methode gebruikt GetStatus. Er zijn twee varianten van de methode: de eerste wordt gedefinieerd als een virtuele methode en de tweede wordt gedefinieerd als een statische methode.

    Virtuele versie van de methode GetStatusbepaalt de open status van het bestand dat aan dit CFile-klasseobject is gekoppeld. Deze methode wordt alleen aangeroepen wanneer een CFile-klasseobject wordt gemaakt en het bestand wordt geopend.

    Statische versie van de methode GetStatusHiermee kunt u de kenmerken bepalen van een bestand dat niet is gekoppeld aan een object van de CFile-klasse. Om deze methode te gebruiken, is het niet nodig om eerst het bestand te openen.

    Blokkeren

    De klasse bevat methoden Vergrendelbereik En Bereik ontgrendelen, waarmee een of meer bestandsgegevens kunnen worden vergrendeld voor toegang door andere processen. Als een toepassing probeert gegevens die eerder door deze of een andere toepassing zijn vergrendeld, opnieuw te vergrendelen, wordt er een uitzondering gegenereerd. Vergrendeling is een van de mechanismen waarmee verschillende applicaties of processen tegelijkertijd aan hetzelfde bestand kunnen werken zonder elkaar te hinderen.

    U kunt een vergrendeling instellen met behulp van de methode Vergrendelbereik. Om geïnstalleerde sloten te verwijderen, moet u de methode gebruikenBereik ontgrendelen. Als er meerdere vergrendelingen in één bestand zijn ingesteld, moet elk ervan worden vrijgegeven door een afzonderlijke methodeaanroepBereik ontgrendelen.

    Positionering

    Om de huidige bestandspositieaanwijzer naar een nieuwe positie te verplaatsen, kunt u een van de volgende klassenmethoden gebruiken CBestand - Zoeken, zoeken naar begin, zoeken naar einde. Naar de klas CBestandbevat ook methoden waarmee u de bestandslengte kunt instellen en wijzigen, -GetLengte, SetLengte.

    Wanneer u een bestand opent, bevindt de huidige bestandspositie-indicator zich helemaal aan het begin van het bestand. Wanneer een stukje gegevens wordt gelezen of geschreven, beweegt de huidige positieaanwijzer naar het einde van het bestand en wijst naar de gegevens die zullen worden gelezen of geschreven door de volgende lees- of schrijfbewerking naar het bestand.

    Om de huidige bestandspositieaanwijzer naar een willekeurige locatie te verplaatsen, kunt u de universele methode gebruiken

    Zoeken. Hiermee kunt u de aanwijzer een bepaald aantal bytes verplaatsen ten opzichte van de begin-, eind- of huidige aanwijzerpositie.

    Om de aanwijzer naar het begin of einde van een bestand te verplaatsen, is het het handigst om speciale methoden te gebruiken. Methode

    ZoekToBeginverplaatst de aanwijzer naar het begin van het bestand en de methodeZoekToEnd- tot het einde.

    Maar om de lengte van een geopend bestand te bepalen, is het niet nodig om de aanwijzer te verplaatsen. Je kunt de methode gebruiken

    Lengte ophalen. Deze methode retourneert ook de lengte van het geopende bestand in bytes. MethodeLengte instellenHiermee kunt u de lengte van het geopende bestand wijzigen. Als deze methode de bestandsgrootte vergroot, is de waarde van de laatste bytes ongedefinieerd.

    De huidige positie van de bestandsaanwijzer kan met behulp van de methode worden bepaald

    GetPositie. Geretourneerd per methodeGetPositieDe 32-bits waarde specificeert de pointer-offset vanaf het begin van het bestand.

    Kenmerken van een geopend bestand

    Om de locatie van een geopend bestand op schijf te bepalen, moet u de methode aanroepen GetFilePath. Deze methode retourneert een object van de klasseCString, dat het volledige pad van het bestand bevat, inclusief de stationsnaam, mappen, bestandsnaam en bestandsextensie.

    Als u alleen de naam en extensie van een geopend bestand hoeft te bepalen, kunt u de methode gebruiken GetFileName. Het retourneert een CString-object dat de bestandsnaam bevat. In het geval dat u alleen de naam van een geopend bestand zonder extensie wilt weten, gebruikt u de methodeGetFileTitel.

    Met de volgende methode van de klasse CFile kunt u het bestandspad instellen. Deze methode maakt, kopieert of wijzigt de bestandsnaam niet; het vult alleen het overeenkomstige gegevenselement in het klasseobject CFile in.

    Klasse C

    Membestand

    De MFC-bibliotheek bevat de klasse

    CMemBestand, geërfd van de basisklasseCBestand. Klas CMemBestandvertegenwoordigt een bestand dat zich in het RAM bevindt. Met klasseobjectenCMemBestandhetzelfde als bij klasseobjectenCBestand. Het verschil is dat het bestand aan het object is gekoppeldCMemBestand, bevindt zich niet op de schijf, maar in het RAM van de computer. Hierdoor zijn de bewerkingen met een dergelijk bestand veel sneller dan met gewone bestanden.

    Werken met klasseobjecten

    CMemBestand, kun je bijna alle methoden van de klasse gebruikenCBestanddie hierboven werden beschreven. U kunt gegevens naar een dergelijk bestand schrijven of lezen. Naast deze methoden bevat de klasseCMemBestandaanvullende methoden inbegrepen.

    Er zijn twee verschillende constructors voor het maken van objecten van de klasse CMemFile. De eerste CMemFile-constructor heeft slechts één optionele parameter nGrowBytes:

    CMemFile(UINT nGrowBytes=1024);

    Deze constructor maakt een leeg bestand in RAM. Eenmaal gemaakt, wordt het bestand automatisch geopend (het is niet nodig om de Ope-methode aan te roepen

    N).

    Wanneer het schrijven naar een dergelijk bestand begint, wordt er automatisch een geheugenblok toegewezen. Om geheugenklassemethoden te verkrijgen

    CMemBestandstandaardfuncties oproepenmalloc, realloc En vrij. Als het toegewezen geheugenblok niet voldoende is, wordt de omvang ervan vergroot. Het geheugenblok van het bestand wordt vergroot met delen van nGrowBytes-bytes. Na het verwijderen van een klasseobjectCMemBestandgebruikt geheugen wordt automatisch teruggestuurd naar het systeem.

    De tweede constructor van de klasse CMemFile heeft een complexer prototype. Deze constructor wordt gebruikt in gevallen waarin de programmeur zelf geheugen voor het bestand toewijst:

    CMemFile(BYTE* lpBuffer, UINT nBufferSize, UINT nGrowBytes=0);

    De parameter lpBuffer specificeert de buffer die voor het bestand moet worden gebruikt. De buffergrootte wordt bepaald door de parameter nBufferSize.

    De optionele parameter nGrowBytes wordt uitgebreider gebruikt dan in de eersteklas constructor. Als nGrowBytes nul bevat, bevat het gegenereerde bestand de gegevens uit de lpBuffer. De lengte van zo'n bestand is gelijk aan nBufferSize.

    Als nGrowBytes groter is dan nul, wordt de inhoud van lpBuffer genegeerd. Als er bovendien meer gegevens naar een dergelijk bestand worden geschreven dan er in de toegewezen buffer passen, neemt de omvang ervan automatisch toe. Het geheugenblok van het bestand wordt vergroot met delen van nGrowBytes-bytes.

    CMemBestandHiermee kunt u een verwijzing krijgen naar het geheugengebied dat door het bestand wordt gebruikt. Via deze pointer kunt u direct met de inhoud van het bestand werken, zonder u te beperken tot klassenmethodenCBestand. Om een ​​verwijzing naar een bestandsbuffer te verkrijgen, kunt u de methode Detach gebruiken. Voordat u dit doet, is het handig om de lengte van het bestand (en dus de grootte van de geheugenbuffer) te bepalen door de methode aan te roepenLengte ophalen. Losmakensluit het gegeven bestand en retourneert een verwijzing naar het geheugenblok dat het gebruikt. Als u het bestand opnieuw moet openen en er een RAM-blok aan moet koppelen, moet u de methode aanroepenBijvoegen.

    Opgemerkt moet worden dat om de bestandsbuffer te beheren, de class

    CMemBestandroept standaardfuncties opmalloc, realloc En vrij. Om het geheugenbeheermechanisme niet te verbreken, moet daarom de lpBuffer-buffer door de functies worden gemaaktmalloc of calloc.

    CStdioFile-klasse

    Degenen die gewend zijn aan het gebruik van de streaming I/O-functies uit de standaardbibliotheek C en C++ moeten op de klasse letten

    CStdioBestand, geërfd van de basisklasseCBestand. Met deze klasse kunt u gebufferde I/O uitvoeren in tekst- en binaire modus. Voor klasseobjectenCStdioBestandJe kunt bijna alle methoden van de klasse CFile aanroepen.CStdioBestandbevat het gegevenselement m_pStream, dat een verwijzing naar het geopende bestand bevat. Als een klasseobjectCStdioBestandgemaakt, maar het bestand is nog niet geopend of gesloten, dan bevat m_pStream de constante NULL.CStdioBestandheeft drie verschillende constructeurs. De eerste constructor van de klasse CStdioFile heeft geen parameters. Deze constructor maakt alleen een klasseobject, maar opent geen bestanden. Om een ​​bestand te openen, moet u de methode aanroepenOpenbasisklasseCBestand.

    Constructeur van de tweede klasse

    CStdioBestandkan worden aangeroepen als het bestand al geopend is en u een nieuw object van de klasse CStdioFile moet maken en het geopende bestand eraan moet koppelen. Deze constructor kan worden gebruikt als het bestand met een standaardfunctie is geopendfopen. De methodeparameter moet een verwijzing bevatten naar het bestand dat wordt verkregen door het aanroepen van de standaardfunctiefopen.

    De derde constructor kan worden gebruikt als u een klasseobject moet maken

    CStdioBestand, open een nieuw bestand en koppel het aan het nieuw gemaakte object.

    Voor het lezen van en schrijven naar een tekstbestand bevat de klasse CStdioFile twee nieuwe methoden:

    LeesString En Schrijfreeks. Met de eerste methode kunt u een reeks tekens uit een bestand lezen, en met de tweede methode kunt u deze schrijven.

    Voorbeelden van schrijven en lezen vanuit een bestand

    Hier volgen codefragmenten die het gebruik van standaarddialoogvensters voor bestandsselectie demonstreren en de procedure voor het lezen van en schrijven naar een bestand.

    Een bestand openen en lezen

    CString m_Text; ……// een standaard bestandsselectiepaneel maken Open CFileDialog DlgOpen(TRUE,(LPCSTR)"txt",NULL, OFN_HIDEREADONLY,(LPCSTR)" Tekstbestanden (*.txt) |*.txt||");// geef het standaardbestandsselectiepaneel weer Open if(DlgOpen.DoModal()==IDOK) (// maak een object en open het bestand om te lezen CStdioFile-bestand(DlgOpen.GetPathName(),CFile::modeRead|CFile::typeBinary);// tekenreeksen uit bestand lezen CString& ref=m_Text; File.ReadString(ref

    ); // er wordt een verwijzing naar een string doorgegeven

    CString m_Text; m_Tekst) Openen en schrijven vanuit een bestand // een standaard SaveAs-bestandsselectiepaneel maken CFileDialog DlgSaveAs(FALSE,(LPCSTR)"txt",NULL, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, (LPCSTR)" Tekstbestanden (*.txt) |*.txt||"); // geef het standaard SaveAs-bestandsselectiepaneel weer if(DlgSaveAs.DoModal()==IDOK) ( // maak een object en open een bestand om te schrijven CStdioFile-bestand(DlgSaveAs.GetPathName(), CFile::modeCreate|CFile::modeWrite|CFile::typeBinary);
      // schrijf naar een stringbestand

      File.WriteString((LPCTSTR)m_Text);

    )

    bevat de werkende code van het programma, ontworpen voor eenvoud als consoletoepassing onder MFC. Om het programma te laten werken, vergeet niet het volgende te doen:

    Tekenreeks_1 123 Tekenreeks_11, 456
    Tekenreeks_2
    Tekenreeks_3

    Sla het bestand op.

    En dit is de code voor een C-programma dat ons bestand opent en er regels uit leest:

    /* *Auteur: @author Subbotin B.P.h> #include #define LEN 50 int main(void) ( puts("Tekstbestandsbewerkingen"); char cArray; FILE *pTextFile = fopen("C:\\TextFile.txt", "r"); if(pTextFile == NULL) ( puts("Problemen"); return EXIT_FAILURE; ) while(fgets(cArray, LEN, pTextFile) != NULL) ( printf("%s", cArray); ) fclose(pTextFile);

    Om een ​​tekstbestand in C te openen, gebruik je de fopen-functie:

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

    Het eerste argument voor de fopen-functie verwijst naar een bestand, en het tweede zegt dat het bestand openstaat om daaruit te lezen.

    We lezen de regels met behulp van de fgets-functie:

    fgets(cArray, LEN, pTextFile);

    Het eerste argument van de functie fgets verwijst naar een karakterarray waarin de ontvangen strings worden opgeslagen, het tweede argument is het maximale aantal te lezen karakters en het derde is ons bestand.

    Nadat u klaar bent met het werken met het bestand, moet u het sluiten:

    fclose(pTextBestand);

    Wij krijgen:

    In de regels verschijnen ook Russische letters.

    Ik heb dit programma trouwens in Eclipse gemaakt. Hoe u met C/C++ kunt werken, ziet u in Eclipse.

    Dus hebben we gegevens uit een tekstbestand geopend en gelezen.

    Nu zullen we leren hoe we programmatisch een tekstbestand kunnen maken en er gegevens naartoe kunnen schrijven.

    /* Auteur: @author Subbotin B.P..h> #include int main(void) ( FILE *pTextFile = fopen("C:\\TextFileW.txt", "w"); char *cString = "Dit is een string"; char cNewLine = "\n"; int nVal = 123 ; if(pTextFile == NULL) ( puts("Problemen"); return EXIT_FAILURE; ) fprintf(pTextFile, "%s%c", cString, cNewLine);

    Maak een tekstbestand om gegevens naar te schrijven:

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

    als het bestand al bestaat, wordt het geopend en worden alle gegevens ervan verwijderd.

    De C-string cString en het getal nVal worden door het programma naar een tekstbestand geschreven. cNewLine is gewoon een nieuwe lijn.

    We schrijven gegevens naar een tekstbestand met behulp van de fprintf-functie:

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

    het eerste argument hier is ons bestand, het tweede is de formatstring, het derde of meer is het aantal argumenten dat nodig is voor dit formaat.

    Voor gemakkelijke toegang wordt informatie op opslagapparaten opgeslagen in de vorm van bestanden.

    Een bestand is een benoemd gebied van extern geheugen dat is toegewezen voor het opslaan van een reeks gegevens. De gegevens in de bestanden zijn van zeer uiteenlopende aard: programma's in algoritmische of machinetaal; initiële gegevens voor programmawerking of programma-uitvoeringsresultaten; vrije teksten; grafische afbeeldingen, enz.

    Directory (map, map) - een benoemde verzameling bytes op een opslagmedium met de namen van submappen en bestanden, gebruikt in het bestandssysteem om de organisatie van bestanden te vereenvoudigen.

    Bestandssysteem het functionele deel van het besturingssysteem genoemd dat bewerkingen op bestanden uitvoert. Voorbeelden van bestandssystemen zijn FAT (FAT – File Allocation Table), NTFS, UDF (gebruikt op cd's).

    Er zijn drie hoofdversies van FAT: FAT12, FAT16 en FAT32. Ze verschillen in de bitdiepte van records in de schijfstructuur, d.w.z. het aantal bits dat is toegewezen om het clusternummer op te slaan. FAT12 wordt voornamelijk gebruikt voor diskettes (tot 4 KB), FAT16 – voor schijven met een kleine capaciteit, FAT32 – voor FLASH-drives met hoge capaciteit (tot 32 GB).

    Laten we eens kijken naar de structuur van het bestandssysteem met FAT32 als voorbeeld.

    FAT32-bestandsstructuur

    Externe geheugenapparaten in het FAT32-systeem hebben blokadressering in plaats van byte-adressering. Informatie wordt in blokken of sectoren naar een extern geheugenapparaat geschreven.

    Een sector is de minimaal adresseerbare eenheid voor informatieopslag op externe opslagapparaten. Normaal gesproken is de sectorgrootte vastgesteld op 512 bytes. Om de adresruimte van externe geheugenapparaten te vergroten, worden sectoren gecombineerd in groepen die clusters worden genoemd.

    Een cluster is een vereniging van meerdere sectoren, die als een zelfstandige eenheid met bepaalde eigenschappen kan worden beschouwd. De belangrijkste eigenschap van een cluster is de grootte ervan, gemeten in het aantal sectoren of aantal bytes.

    Het FAT32-bestandssysteem heeft de volgende structuur.

    De clusters die worden gebruikt voor het schrijven van bestanden zijn genummerd vanaf 2. In de regel wordt cluster nr. 2 gebruikt door de hoofdmap, en vanaf cluster nr. 3 wordt de data-array opgeslagen. Sectoren die worden gebruikt om informatie boven de hoofdmap op te slaan, zijn niet geclusterd.
    De minimaal vereiste bestandsgrootte op schijf komt overeen met 1 cluster.

    De opstartsector begint met de volgende informatie:

    • EB 58 90 – onvoorwaardelijke sprong en handtekening;
    • 4D 53 44 4F 53 35 2E 30 MSDOS5.0;
    • 00 02 – aantal bytes in de sector (meestal 512);
    • 1 byte – aantal sectoren in het cluster;
    • 2 bytes – aantal reservesectoren.

    Bovendien bevat de opstartsector de volgende belangrijke informatie:

    • 0x10 (1 byte) – aantal FAT-tabellen (meestal 2);
    • 0x20 (4 bytes) – aantal sectoren op de schijf;
    • 0x2С (4 bytes) – clusternummer van de hoofdmap;
    • 0x47 (11 bytes) – volumelabel;
    • 0x1FE (2 bytes) – handtekening van de opstartsector (55 AA).

    De bestandssysteeminformatiesector bevat:

    • 0x00 (4 bytes) – handtekening (52 52 61 41);
    • 0x1E4 (4 bytes) – handtekening (72 72 41 61);
    • 0x1E8 (4 bytes) – aantal vrije clusters, -1 indien onbekend;
    • 0x1EC (4 bytes) – nummer van het laatst opgenomen cluster;
    • 0x1FE (2 bytes) – handtekening (55 AA).

    De FAT-tabel bevat informatie over de status van elk cluster op de schijf. De onderste 2 bytes van de FAT-tabel slaan F8 FF FF 0F FF FF FF FF op (wat overeenkomt met de status van clusters 0 en 1, die fysiek afwezig zijn). Vervolgens bevat de status van elk cluster het nummer van het cluster waarin het huidige bestand verdergaat of de volgende informatie:

    • 00 00 00 00 – cluster is gratis;
    • FF FF FF 0F – einde van het huidige bestand.
    • 8 bytes – bestandsnaam;
    • 3 bytes – bestandsextensie;

    De hoofdmap bevat een reeks 32-bits informatierecords over elk bestand, met de volgende informatie:

    Wanneer u met lange bestandsnamen werkt (inclusief Russische namen), wordt de bestandsnaam gecodeerd met behulp van het UTF-16-coderingssysteem. In dit geval worden 2 bytes toegewezen voor het coderen van elk teken. In dit geval wordt de bestandsnaam in de volgende structuur geschreven:

    • 1 sequentiebyte;
    • 10 bytes bevatten de onderste 5 tekens van de bestandsnaam;
    • 1 byte attribuut;
    • 1 byte gereserveerd;
    • 1 byte – DOS-naamcontrolesom;
    • 12 bytes bevatten de onderste 3 tekens van de bestandsnaam;
    • 2 bytes – nummer van het eerste cluster;
    • de resterende tekens van de lange naam.

    Werken met bestanden in C-taal

    Voor de programmeur wordt een geopend bestand weergegeven als een reeks gegevens die worden gelezen of geschreven. Wanneer een bestand wordt geopend, wordt het gekoppeld aan I/O-stroom. Uitvoerinformatie wordt naar de stream geschreven, invoerinformatie wordt uit de stream gelezen.

    Wanneer een stream wordt geopend voor I/O, wordt deze geassocieerd met een standaard FILE-structuur, die is gedefinieerd in stdio.h. De FILE-structuur bevat de benodigde informatie over het bestand.

    Het openen van een bestand gebeurt met behulp van de functie fopen(), die een verwijzing retourneert naar een FILE-structuur die kan worden gebruikt voor daaropvolgende bewerkingen op het bestand.

    BESTAND *fopen(naam, type);


    naam – naam van het bestand dat moet worden geopend (inclusief pad),
    type is een verwijzing naar een reeks tekens die bepalen hoe het bestand wordt geopend:
    • "r" - open het bestand om te lezen (het bestand moet bestaan);
    • "w" - open een leeg bestand om te schrijven; als het bestand bestaat, gaat de inhoud ervan verloren;
    • "a" - open het bestand om naar het einde te schrijven (om toe te voegen); het bestand wordt aangemaakt als het niet bestaat;
    • "r+" - open het bestand voor lezen en schrijven (het bestand moet bestaan);
    • "w+" - open een leeg bestand om te lezen en te schrijven; als het bestand bestaat, gaat de inhoud ervan verloren;
    • "a+" - open het bestand om te lezen en toe te voegen; het bestand bestaat niet, dan wordt het gemaakt.

    De retourwaarde is een verwijzing naar de open stream. Als er een fout optreedt, wordt NULL geretourneerd.

    De functie fclose() sluit de stream of streams die zijn gekoppeld aan bestanden die zijn geopend met de functie fopen(). De te sluiten stream wordt bepaald door het argument van de functie fclose().

    Retourwaarde: waarde 0 als de stream succesvol is afgesloten; constante EOF als er een fout is opgetreden.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16

    #erbij betrekken
    int hoofd() (
    BESTAND *fp;
    char naam = "mijn.txt";
    if ((fp = fopen(naam, "r" )) == NULL )
    {
    printf( "Kan bestand niet openen");
    getchar();
    retour 0;
    }
    // slaagde erin het bestand te openen
    ... // vereiste acties op gegevens
    fsluiten(fp);
    getchar();
    retour 0;
    }

    Een teken uit een bestand lezen:

    char fgetc(stroom);


    Het functieargument is een verwijzing naar een stroom van het type FILE. De functie retourneert de code van het gelezen teken. Als het einde van het bestand wordt bereikt of als er een fout optreedt, wordt de constante EOF geretourneerd.

    Een symbool naar een bestand schrijven:

    fputc(char, stroom);

    De argumenten van de functie zijn een teken en een verwijzing naar een stroom van het type FILE. De functie retourneert de code van het gelezen teken.

    De functies fscanf() en fprintf() zijn vergelijkbaar met de functies scanf() en printf(), maar werken met gegevensbestanden en hebben een verwijzing naar het bestand als eerste argument.

    fscanf(stream, "InputFormat", argumenten);

    Het I/O-mechanisme dat is ontwikkeld door , voldoet niet aan de algemeen aanvaarde stijl van objectgeoriënteerd programmeren van vandaag. Bovendien maakt het intensief gebruik van pointer-operaties, die als potentieel onveilig worden beschouwd in moderne, veilige code-uitvoeringsomgevingen. Een alternatief bij het ontwikkelen van applicatieapplicaties is het mechanisme van standaard I/O-klassen dat wordt geboden door de taalstandaard C++.

    Bestanden openen

    De meest gebruikte klassen zijn ifstream voor lezen, ofstream voor schrijven en fstream voor het wijzigen van bestanden.

    Alle threaded I/O-klassen zijn indirect afgeleid van de gemeenschappelijke voorloper ios en nemen de functionaliteit ervan volledig over. De bestandsopeningsmodus wordt dus gespecificeerd door het gegevenslid van het opgesomde type open_mode, dat als volgt is gedefinieerd:

    Enum open_mode (app, binair, in, uit, trunc, at);

    Hieronder staan ​​de mogelijke waarden van de vlaggen en hun doel.

    Als u bijvoorbeeld een bestand met de naam test.txt wilt openen om gegevens in binaire vorm te lezen, schrijft u het volgende:

    ifstream-bestand; file.open("test.txt", ios::in | ios::binair);

    Met de logische OR-operator (|) kunt u een modus creëren met elke combinatie van vlaggen. Om ervoor te zorgen dat u bij het openen van een bestand door invoer niet per ongeluk een bestaand bestand met dezelfde naam overschrijft, moet u het volgende formulier gebruiken:

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

    Er wordt aangenomen dat het bijbehorende headerbestand in het project is opgenomen:

    #erbij betrekken

    Om te controleren of het bestand succesvol is geopend, kunt u de constructie gebruiken

    If (!file) ( //Afhandeling bij het openen van bestanden)

    Inclusie- en extractieoperatoren

    Overschreven in bestandsverwerkingsklassen inclusie-operator (<<) записывает данные в файловый поток. Как только вы открыли файл для записи, можно записывать в него текстовую строку целиком:

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

    U kunt een tekstreeks ook in delen schrijven:

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

    De endl-instructie beëindigt de regelinvoer met een harde return:

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

    Met behulp van de include-operator is het eenvoudig om de waarden van variabelen of array-elementen naar een bestand te schrijven:

    Ofstream-bestand("Temp.txt"); char buff = "Tekstmatrix bevat variabelen"; int vx = 100; vlotter pi = 3,14159; bestand<< buff << endl << vx << endl << pi << endl;

    Als resultaat van het uitvoeren van de code worden drie regels van het tekstbestand Temp.txt gevormd:

    De tekstarray bevat variabelen 100 3.14159

    Houd er rekening mee dat numerieke waarden naar het bestand worden geschreven als tekstreeksen in plaats van als binaire waarden.

    Ophaaloperator(>>) levert het tegenovergestelde effect op. Het lijkt erop dat als je tekens uit het eerder geschreven Temp.txt-bestand wilt extraheren, je code als de volgende schrijft:

    Ifstream-bestand("Temp.txt"); char buff; int vx; zwevende pi; bestand >> buff >> vx >> pi;

    De extractieoperator stopt echter bij het eerste scheidingsteken dat hij tegenkomt (spatie, tab of nieuwe regel). Dus bij het parseren van de zin “Tekstarray bevat variabelen”, wordt alleen het woord “Tekst” naar de buff-array geschreven, de spatie wordt genegeerd en het woord “array” wordt de waarde van de gehele vx-variabele, en code de uitvoering zal “mislopen” met onvermijdelijke schending van de datastructuur. Vervolgens zullen we bij het bespreken van de ifstream-klasse laten zien hoe u het lezen van het bestand uit het vorige voorbeeld op de juiste manier kunt organiseren.

    ifstream-klasse: bestanden lezen

    Zoals de naam al doet vermoeden, is de ifstream-klasse ontworpen om een ​​bestandsstroom in te voeren. De belangrijkste methoden van de klasse worden hieronder vermeld. De meeste zijn overgenomen van de istream-klasse en overbelast om de bovenliggende functionaliteit uit te breiden. De get-functie kan bijvoorbeeld, afhankelijk van de aanroepparameter, niet alleen een enkel teken lezen, maar ook een blok tekens.

    Nu is het duidelijk hoe het vorige voorbeeld moet worden aangepast, zodat het gebruik van de data-extractieoperator het verwachte resultaat oplevert:

    Ifstream-bestand("Temp.txt"); char buff; int vx; zwevende pi; file.getline(buff, sizeof(buff)); bestand >> vx >> pi:

    De getline-methode leest de eerste regel van het bestand tot het einde, en de >>-operator wijst waarden toe aan de variabelen.

    In het volgende voorbeeld ziet u hoe u gegevens toevoegt aan een tekstbestand en vervolgens het hele bestand leest. Er wordt een while(1)-lus gebruikt in plaats van while(!file2.eof()) om redenen die worden besproken in .

    #erbij betrekken #erbij betrekken naamruimte std gebruiken; int main() ( ofstream bestand; file.open("test.txt",ios::out|ios::app); if (!file) ( 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 >> een;<< a << " "; k++; } cout << endl << "K=" << k << endl; file2.close(); cin.sync(); cin.get(); return 0; }

    als (bestand2.eof()) kapot gaat;

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

    In het volgende voorbeeld ziet u een lus die regels uit het bestand test.txt leest en op de console weergeeft.

    naamruimte std gebruiken; int main() ( ifstream bestand; // maak een streamobjectbestand file.open("test.txt"); // open het bestand om te lezen if (!file) return 1; // return on opening error char str; // statische lijnbuffer // Lees en toon regels in een lus totdat eof while (!file.getline(str, sizeof(str)).eof()) cout<< str << endl; }

    Deze code onder Windows OS is ook afhankelijk van de aanwezigheid van een newline-teken in de laatste regel van het bestand; het zou betrouwbaarder zijn om dit te doen:

    While (1) ( if (file.eof()) break; file.getline(str, sizeof(str)); cout

    Expliciete aanroepen van de open- en close-methoden zijn niet vereist. Door de constructor met een argument aan te roepen, kunt u het bestand onmiddellijk openen, op het moment dat u het threaded file-object maakt:

    Ifstream-bestand("test.txt");

    In plaats van de close-methode kunt u de delete-operator gebruiken, die automatisch de destructor van het bestandsobject aanroept en het bestand sluit. De while-luscode zorgt voor goede controles aan het einde van het bestand.

    ofstream klasse: bestanden schrijven

    De klasse ofstream is ontworpen om gegevens uit een bestandsstroom uit te voeren. Hieronder worden de belangrijkste methoden van deze klasse vermeld.<=3; i++) file << "Строка " << i << endl; file.close();

    De eerder beschreven insluitingsoperator is handig voor het organiseren van schrijven naar een tekstbestand:

    In principe worden binaire gegevens behandeld als tekstgegevens. Het verschil is dat als binaire gegevens in een specifieke logische structuur worden geschreven, deze uit een bestand moeten worden gelezen in een variabele van hetzelfde structuurtype.

    De eerste parameter van de schrijf- en leesmethoden (het adres van het schrijf-/leesblok) moet van het karakter pointertype char * zijn, dus het is noodzakelijk om een ​​expliciete conversie uit te voeren van het adrestype van de void *-structuur. De tweede parameter specificeert dat de binaire blokken van het bestand een constante bytegrootte hebben, ongeacht de werkelijke recordlengte. De volgende toepassing biedt een voorbeeld van het maken en weergeven van gegevens in een eenvoudig notitieblok. De bestandsitems worden vervolgens opeenvolgend gelezen en weergegeven op de console.

    #erbij betrekken #erbij betrekken #erbij betrekken naamruimte std gebruiken; struct Notes ( // notebook datastructuur char Naam; // volledige naam char Telefoon; // phone int Leeftijd; // leeftijd ); int main() ( setlocale(LC_ALL, "Russisch"); Notes Note1= ("De verschrikkelijke Ioann Vasilyevich", "niet geïnstalleerd", 60 ); Notes Note2= ("Godoenov Boris Fedorovich", "095-111-2233" , 30 ); Notes Note3= ("Romanov Petr Mikhailovich", "812-333-2211", 20 ); sizeof (Notities)); // 1e blok van bestand.write((char*)&Note2, sizeof(Notes)); // 2e blok van bestand.write((char*)&Note3, 3e blok van bestand .close(); // sluit het opgenomen bestand ifstream ifile("Notebook.dat", ios::binary); // gestructureerde variabele char str; // statische stringbuffer // Lees en toon regels in een lus tot eof while (!ifile.read((char*)&Note, sizeof(Notes)).eof()) ( sprintf(str, "%s\tPhone: %s\tAge: %d" , Note.Name, Note.Phone, Opmerking.Leeftijd);<< str << endl; } ifile.close(); // закрыть прочитанный файл cin.sync(); cin.get(); return 0; }

    Als gevolg van het uitvoeren van deze code wordt een binair bestand Notebook.dat gevormd uit drie blokken van elk 80 bytes (ervan uitgaande dat de tekens uit één byte bestaan). Uiteraard kunt u andere threading-methoden gebruiken en bewerkingen uitvoeren op de velden van een specifieke gegevensstructuur.

    fstream-klasse: willekeurige bestandstoegang

    Laten we aannemen dat we 100 vermeldingen in ons notitieboekje hebben, en we willen de 50e tellen. Natuurlijk kunt u een lus organiseren en alle records lezen, van de eerste tot de gegeven. Het is duidelijk dat een meer gerichte oplossing is om de pos-bestandspositieaanwijzer rechtstreeks op item 50 te zetten en daaruit te lezen:

    Ifstream ifile("Notebook.dat", ios::binary); int pos = 49 * sizeof(Opmerkingen); ifile.seekg(pos); // zoek naar de 50e Notes Note-invoer;

    //Notes – de hierboven beschreven “record”-structuur ifile.read((char*)&Note, sizeof(Notes));

    Dergelijke zoekbewerkingen zijn effectief als het bestand bestaat uit records met een bekende en constante grootte. Om de inhoud van een willekeurig record te vervangen, moet u de uitvoerstroom openen in de wijzigingsmodus:

    Ofstream ofile ("Notebook.dat", ios::binary | ios::ate); int pos = 49 * sizeof(Opmerkingen); ofile seekp(pos); // zoek naar de 50e noot Notes Note50 = ("Jeltsin Boris Nikolajevitsj", "095-222-3322", 64); ofile.write((char*)&Notitie, groottevan(Notities)); // vervanging

    Als u de vlag ios::ate (of ios::app) niet opgeeft, wordt de vorige inhoud gewist wanneer u het binaire bestand Notebook.dat opent!

    Ten slotte is het mogelijk om tegelijkertijd een bestand te openen om te lezen/schrijven, met behulp van de methoden die de fstream-streamingklasse heeft geërfd van zijn voorgangers. Omdat de fstream-klasse is afgeleid van istream en ostream (respectievelijk de ouders van ifstream en ofstream), worden alle eerder genoemde methoden beschikbaar in de applicatie.

    #erbij betrekken #erbij betrekken #erbij betrekken In het volgende voorbeeld ziet u de herschikking van de eerste en derde vermeldingen in het bestand Notebook.dat.<== 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; }

    naamruimte std gebruiken; struct Opmerkingen (char Naam; char Telefoon; int Leeftijd; ); int main() ( setlocale(LC_ALL, "Russisch"); Notes Note1, Note3; // Open het bestand om tegelijkertijd te lezen/schrijven fstream file("Notebook.dat", ios::binary | ios::in | ios: : out); file.seekg(2 * sizeof(Notes)); // vind en lees Note3 file.read((char*)&Note3, sizeof(Notes) // vind en lees Note1 file.read((char *)&Opmerking1, groottevan(Notities)); bestand.seekg(0);

    In de constructor van het bestandsobject moet u de vlaggen ios::in en ios::out opgeven, waardoor gelijktijdige lees- en schrijfbewerkingen mogelijk zijn. Als gevolg van het uitvoeren van deze code worden de eerste en derde vermeldingen in het binaire bestand Notebook.dat verwisseld.



    
    2024, leally.ru - Uw gids in de wereld van computers en internet