Video: Flagga 2024
När du öppnar en fil genom att bygga antingen en uppströms eller omströmsinstans kan du ändra hur filen öppnas genom att tillhandahålla vad som kallas flaggor. I datorns termer är en flagga helt enkelt ett litet föremål vars närvaro eller brist på närvaro berättar en funktion hur man gör något. Med uppströms- och ifströmsklasserna är den aktuella funktionen konstruktören.
En flagga ser ut som ios:: app om du använder en kompilator som inte är fullständigt ANSI-kompatibel, eller ser ut som ios_base:: app om du använder en som är fullständigt ANSI-kompatibel. Den här flaggan innebär att du vill skriva till en fil, men du vill lägga till befintliga data som redan finns i en fil. Du tillhandahåller denna flagga som ett argument för konstruktören för uppströms, som i något av följande exempel:
ofstream outfile ("AppendableFile. Txt", ios:: app); ofstream outfile ("AppendableFile. txt", ios_base:: app);
Du kan se att flaggan läggs till som en andra parameter till konstruktören. Andra flaggor finns förutom app, och du kan kombinera dem med hjälp av eller operatören, |. En flagga är till exempel ios:: nocreate (som inte ingår i nyare kompilatorer).
Den här betyder "bara öppna filen om den redan finns. "Det vill säga, skapa inte filen om den inte existerar. (Kom ihåg att uppströms skapar en fil om den inte existerar.) Om filen inte existerar, kommer den öppna att misslyckas, och när du ringer misslyckas kommer du tillbaka en sann .
Ios:: nocreate flaggan är praktisk med ios:: app. Tillsammans betyder dessa en befintlig fil och lägger till den . Det vill säga de två tillsammans kommer bara att fungera om filen redan existerar, och samtalet öppnar filen för en tilläggsoperation. Om filen inte existerar kommer filen inte att skapas. Här är ett provsamtal:
ofstream outfile ("… / MyFile.txt", ios:: app | ios:: nocreate); om (outfile. fail ()) {cout << "kunde inte öppna filen!" << endl; returnera 0;} outfile << "hej" << endl; utfil. stänga();
Om MyFile. txt existerar inte när du kör den här koden, du får meddelandet Kunde inte öppna filen! Men om MyFile. txt existerar, programmet öppnar det, lägger till strängen Hej till det, och slutligen stänger den.
Det visar sig att den nocreate flaggan inte är tillgänglig i det nya standardbiblioteket. Besvikelse. Koden fungerar därför endast om du använder en tidigare version av biblioteket. När du använder koden:: Blocker kompilator ser du följande felmeddelande:
fel: 'nocreate' är inte medlem i '; std:: ios '
Men du vill testa om din kompilator innehåller ett bibliotek som stöder iOS:: nocreate.Din kompilator kan stödja det ändå, även om det innehåller det nya standardbiblioteket. Som ett alternativ till ios:: nocreate kan du använda följande kod (finns i FileOutput02-exemplet):
ifstream infile ("… / MyFile. Txt"); om (infile. fail ()) {cout << "kunde inte öppna filen!" << endl; returnera 0;} infile. stänga(); ofstream outfile ("… / MyFile. txt", ios:: app); outfile << "hej" << endl; utfil. stänga();
I det här fallet börjar du genom att försöka öppna filen för läsning. Om filen inte existerar kan du inte läsa av den och koden avslutas med ett felmeddelande. Om koden kan läsa från filen, öppnar den filen igen för att skriva. Det här är en besvärlig lösning, men det fungerar.
Följande är en lista över tillgängliga flaggor. Först här är de för ios, om du använder en kompilator som inte är fullständigt ANSI-kompatibel:
-
ios:: app: Den här flaggan innebär att du vill öppna en fil och lägga till den.
-
ios:: in: Inkludera denna flagga om du vill läsa från en fil.
-
ios:: out : Inkludera denna flagga om du vill skriva till en fil.
-
ios:: trunc : Inkludera denna flagga om du vill torka bort innehållet i filen innan du skriver till den. Det är motsatsen till att lägga till, och det är också standard om du inte specifikt innehåller ios:: app.
-
ios:: nocreate : Använd den här flaggan om du vill se till att filen inte skapas om den inte finns, vilket leder till att filen inte öppnas.
-
ios:: noreplace : Denna flagga är motsatt av nocreate. Använd den här flaggan om du bara vill skapa en ny fil. Om du använder den här flaggan och filen redan existerar öppnas filen inte och det felet kommer att returneras sant .
ANSI-kompatibla kompilatorer stöder inte heller iOS:: noreplace-flaggan. I det här fallet kan du använda motsatsen till åtgärden för ios: nocreate-flaggan, som visas här (och finns i FileOutput03-exemplet):
ifstream infile ("… / MyFile. Txt"); om (! infile. fail ()) {cout << "filen finns redan!" << endl; returnera 0;} infile. stänga(); ofstream outfile ("… / MyFile. txt"); outfile << "hej" << endl; utfil. stänga();
I det här fallet försöker koden att öppna filen för läsning. Om filen finns visas koden ett felmeddelande och utgångar. Annars skapar koden en ny fil och skriver till den.
Följande flaggor finns i en komprimerare som är absolut ANSI-kompatibel!
-
ios:: ate: Använd den här flaggan för att gå till slutet av filen efter att du öppnat den. Normalt använder du den här flaggan när du vill lägga till data i filen.
-
ios_base:: binär: Använd den här flaggan för att ange att filen du öppnar kommer att hålla binär data - det vill säga data som inte representerar teckensträngar.
-
ios_base:: in: Ange denna flagga när du vill läsa från en fil.
-
ios_base:: out: Inkludera denna flagga när du vill skriva till en fil.
-
ios_base:: trunc: Inkludera denna flagga om du vill radera innehållet i en fil innan du skriver till den.
-
ios_base:: app: Inkludera den här flaggan om du vill lägga till filen. Det är motsatsen till trunc - det vill säga den information som redan finns i filen när du öppnar den kommer att stanna kvar där.
Varför behöver du en flagga och en flagga? Det verkar som om datorn ska veta om du skriver till en fil eller läser av den, beroende på respektive om du använder stream eller omström. Svaret på varför du har en in-flagga och en ut-flagga är att andra klasser är tillgängliga förutom stream och ifstream.
Samlarna som ännu inte fullt ut stöder ANSI-standarden har en generisk klass i sina bibliotek som heter fstream. ANSI-kompatibla kompilatorer har i sina bibliotek en mallklass som heter basic_filebuf och en klass som heter filebuf. Om du använder dessa klasser kan du använda in och ut flaggor.