Filhåndtering i C++
Filhåndtering betyder læsning fra og skrivning til filer (som .txt .csv osv.) ved hjælp af klasser leveret af C++ standardbiblioteket.
- Programmer kører i RAM, hvilket betyder, at data kun eksisterer, mens programmet kører, når et program afslutter, går alle data i RAM automatisk tabt.
- Filhåndtering tillader lagring af data i sekundær hukommelse (som HDD eller SSD), så de kan bevares permanent og kan gemmes og tilgås, selv efter programmet er afsluttet.
- Til filoperationer giver C++ filstreamklasser i
header såsom ofstream ifstream fstream.
Åbning af en fil
Før vi læser fra eller skriver til en fil, skal vi først åbne den. Åbning af en fil indlæser denne fil i RAM. I C++ åbner vi en fil ved at oprette en strøm til den ved hjælp af fstream klasse, der repræsenterer filstrømmen, dvs. stream til input og output til filen.
C++ fstream str ( 'filename.ext' mode );
hvor
- str: Navn givet til strømmen
- filnavn: Navnet på filen
- mode : Repræsenterer den måde, hvorpå vi vil interagere med filen.
Filåbningstilstande
Filåbningstilstand angiver, at filen er åbnet til at læse skrivning eller tilføjelse. Nedenfor er listen over alle filtilstande i C++:
| Mode | Beskrivelse |
|---|---|
| ios::in | Filen er åben til læsning. Hvis filen ikke findes, mislykkes den åbne operation. |
| ios::ud | Fil åben til skrivning: den interne stream buffer understøtter output operationer. |
| ios::binær | Operationer udføres i binær tilstand i stedet for tekst. |
| ios::at | Outputpositionen starter i slutningen af filen. |
| ios::app | Alle output-operationer sker i slutningen af filen, der føjes til dets eksisterende indhold. |
| ios::trunk | Alt indhold, der fandtes i filen, før den åbnes, kasseres. |
For eksempel hvis vi vil åbne filen til læsning, bruger vi følgende åbningstilstand:
C++ fstream filein ( 'file.txt' ios :: in );
På samme måde, hvis vi ønsker at åbne filen til skrivning, bruger vi følgende:
C++ fstream fileout ( 'file.txt' ios :: out );
Disse tilstande kan også kombineres med OR-operatoren (|). For eksempel kan du åbne filstrømmen i både læse- og skrivetilstand som vist:
C++ fstream str ( 'file.txt' ios :: in | ios :: out );
Hvis filen åbnet i skrivetilstand ikke eksisterer, oprettes en ny fil. Men hvis filen, der er åbnet i læsetilstand, ikke eksisterer, oprettes der ingen ny fil, og en undtagelse kastes
Andre filstrømme
fstream er ikke den eneste filstrøm leveret af C++. Der er to mere specialiserede strømme:
- ifstream : Står for input filstrøm. Det svarer til åben fstream in ios::in mode.
- ofstream : Står for output filstrøm. Det svarer til at åbne fstream ind ios::ud mode.
Ovenstående tilstande er standardtilstande for disse streams. Disse tilstande kan ikke ændres, men kan klubbes sammen med andre tilstande. Nu til input kan vi også bruge ifstream som vist:
C++ ifstream filein ( 'file.txt' );
Tilsvarende for output:
C++ ofstream fileout ( 'file.txt' );
Skriv data til fil
Når filen er åbnet i skrivetilstand ved hjælp af enten fstream eller ofstream vi kan udføre skriveoperationen på samme måde som med cout ved hjælp af < < operator.
C++ #include using namespace std ; int main () { // Open a file ofstream file ( 'GFG.txt' ); // Write the string to the file file < < 'Welcome to GeeksforGeeks.' ; return 0 ; }
GFG.tekst Læs data fra fil
Når først filen er åbnet i læsetilstand ved hjælp af enten fstream eller ifstream, kan vi udføre skriveoperationen på samme måde som med cin ved hjælp af >> operatør.
C++ #include using namespace std ; int main () { // Open a file in read mode ifstream file ( 'GFG.txt' ); string s ; // Read string from the file file >> s ; cout < < 'Read String: ' < < s ; return 0 ; }
Produktion
Read String: WelcomeDette har samme problem som cin. Indtastningen tages kun indtil det første mellemrumstegn. For at undgå dette kan vi bruge getline() fungerer som vist:
C++#includeusing namespace std ; int main () { // Open a file in read mode ifstream file ( 'GFG.txt' ); string s ; // Read string from the file getline ( file s ); cout < < 'Read String: ' < < s ; return 0 ; }
ProduktionRead String: Welcome to GeeksforGeeks.Lukning af filen
At lukke filen betyder at lukke den tilknyttede strøm og frigøre de ressourcer, som vi bliver brugt. Det er vigtigt at lukke filen, når du er færdig med den, især i de langvarige programmer for at undgå hukommelseslækager datatab osv.
I C++ lukkes filerne ved hjælp af tæt() medlemsfunktion, der er til stede i alle filstrømme.
C++#includeusing namespace std ; int main () { // Open a file in read mode ifstream file ( 'GFG.txt' ); string s ; // Read string from the file getline ( file s ); cout < < 'Read String: ' < < s ; // Close the file file . close (); return 0 ; }
ProduktionRead String: Welcome to GeeksforGeeks.Fejl i filhåndtering
Der kan opstå mange forskellige typer fejl i filhåndteringen, såsom fil ikke fundet disk fuld osv. Vores programmer bør forvente almindelige fejl og skal kunne håndtere dem korrekt. Følgende er nogle almindelige fejl, der kan opstå under filhåndtering:
Fejl ved åbning af fil
Der kan være tilfælde, hvor filen ikke åbnes af forskellige årsager, såsom at den ikke eksisterer, eller programmet ikke har tilladelse til at åbne den osv. I dette tilfælde kan vi bruge er_åben() medlemsfunktion af filstrømsklasserne for at kontrollere, om filen er åbnet med succes eller ej.
C++#includeusing namespace std ; int main () { fstream file ( 'nonexistent_file.txt' ios :: in ); // Check if the file is opened if ( ! file . is_open ()) { cerr < < 'Error: Unable to open file!' < < endl ; return 1 ; } file . close (); return 0 ; }
ProduktionError: Unable to open file!Manglende læsning/skrivning af data
En anden almindelig fejl er manglende læsning eller skrivning af data af årsager såsom forkert tilstand osv. I dette tilfælde kan vi validere operationer efter hvert læse-/skriveforsøg. For eksempel kan læsning ved hjælp af getline() valideres som viser:
C++#includeusing namespace std ; int main () { fstream file ( 'GFG.txt' ios :: out ); if ( ! file . is_open ()) { cerr < < 'Error: Unable to open file!' < < endl ; return 1 ; } string line ; // Checking if getline() read successfully or not if ( ! getline ( file line )) cerr < < 'Error: Failed to read data' < < endl ; file . close (); return 0 ; }
ProduktionError: Failed to read dataEnd-of-File (EOF)-fejl
Forsøg på at læse ud over slutningen af filen kan forårsage en EOF-fejl. Dette kan ske, når du ikke tjekker for slutningen af filen, før du læser. Vi kan tjekke for EOF ved hjælp af eof() medlemsfunktion.
C++#includeusing namespace std ; int main () { ifstream file ( 'GFG.txt' ); if ( ! file . is_open ()) { cerr < < 'Error: Unable to open file!' < < endl ; return 1 ; } string line ; while ( getline ( file line )) cout < < line < < endl ; // Check for eof if ( file . eof ()) cout < < 'Reached end of file.' < < endl ; else cerr < < 'Error: File reading failed!' < < endl ; file . close (); return 0 ; }
ProduktionReached end of file.Bemærk, at vi også har valideret læseoperationen, før vi tjekker EOF som getline() vil kun vende tilbage nullptr selvom læsningen mislykkes af en eller anden grund.
Håndtering af binære filer
I C++ kan vi også klare binære filer som gemmer data i råformat. For at læse og skrive binære data skal du bruge ios::binær flag, når du opretter/åbner en binær fil.
Skriv i binær fil
For at skrive data til en binær fil skal vi først åbne eller oprette filen i ios::binær mode.
C++#include#include #include using namespace std ; int main () { string str = 'Welcome to GeeksForGeeks' ; // Open a binary file for writing ofstream file ( 'fileBin.bin' ios :: binary ); // Check if the file is open if ( ! file ) { cerr < < 'Error opening the file for writing.' ; return 1 ; } // Write the length of the string (size) to file first size_t strLength = str . length (); file . write ( reinterpret_cast < const char *> ( & strLength ) sizeof ( strLength )); // Write the string to the binary file file . write ( str . c_str () strLength ); // Close the file file . close (); return 0 ; }
ProduktionBinær fil
Læsning fra binær fil
Ligesom vi åbner en fil i binær tilstand for at skrive data for at læse data fra en binær fil, skal vi åbne filen i læsetilstand vha. ios::in .
Syntaks:
C++C++fstream fileInstance ( 'fileName.bin' ios :: in | ios :: binary );#include#include #include using namespace std ; int main () { string str ; // Open the binary file for reading fstream file ( 'fileBin.bin' ios :: in | ios :: binary ); // Check if the file is open if ( ! file ) { cerr < < 'Error opening the file for reading.' ; return 1 ; } // Read the length of the string (size) from the file size_t strLength ; file . read ( reinterpret_cast < char *> ( & strLength ) sizeof ( strLength )); // Allocate memory for the string and read the data char * buffer = new char [ strLength + 1 ]; // +1 for the null-terminator file . read ( buffer strLength ); // Null-terminate the string buffer [ strLength ] = ' ' ; // Convert the buffer to a string str = buffer ; // Print file data cout < < 'File Data: ' < < str ; delete [] buffer ; file . close (); return 0 ; }
ProduktionFile Data: Welcome to GeeksForGeeksAndre filhandlinger
Vi kan også udføre flere operationer for at manipulere en fil fra vores C++-program. nogle af de almindelige filhandlinger er:
Opret Quiz
- C++-program til at slette en fil
- Tilføj en streng i en eksisterende fil
- Kopier en fil til en anden fil
Binær fil