Video: Section: Debugging with Dan Armendariz 2024
Wanneer u een bestand opent door een ofstream- of ifstream-instantie te construeren, kunt u de manier wijzigen waarop het bestand wordt geopend door zogenaamde flags te leveren. In computertermen is een -markering eenvoudigweg een klein item waarvan de aanwezigheid of het gebrek aan aanwezigheid een functie aangeeft om iets te doen. Met de ofstream- en ifstream-klassen is de betreffende functie de constructor.
Een vlag ziet eruit als ios:: app als u een compiler gebruikt die niet volledig ANSI-compatibel is, of eruitziet als ios_base:: app als u er een gebruikt die volledig ANSI-compatibel is. Deze specifieke vlag betekent dat u naar een bestand wilt schrijven, maar dat u wilt toevoegen aan bestaande gegevens die zich al in een bestand bevinden. U levert deze vlag als een argument van de constructor voor ofstream, zoals in een van de volgende voorbeelden:
ofstream outfile ("AppendableFile. Txt", ios:: app); ofstream outfile ("AppendableFile. txt", ios_base:: app);
U kunt zien dat de vlag als een tweede parameter aan de constructor is toegevoegd. Naast de app bestaan andere vlaggen en u kunt ze combineren met de operator of, |. Eén vlag is bijvoorbeeld ios:: nocreate (dat niet is opgenomen in nieuwere compilers).
Dit betekent "open het bestand alleen als het al bestaat. "Dat wil zeggen, maak het bestand niet aan als het niet bestaat. (Denk eraan, ofstream maakt een bestand als het nog niet bestaat.) Als het bestand niet bestaat, mislukt het openen en wanneer u een melding faxt, krijgt u een echte terug.
De ios:: nocreate-vlag is handig bij ios:: app. Samen betekent dit dat een bestaand bestand opent en eraan wordt toegevoegd . Dat wil zeggen, de twee samen werken alleen als het bestand al bestaat en de aanroep opent het bestand voor een appendage. Als het bestand nog niet bestaat, wordt het bestand niet gemaakt. Hier is een voorbeeldvraag:
ofstream outfile ("… / MyFile. Txt", ios:: app | ios:: nocreate); if (outfile. fail ()) {cout << "kon het bestand niet openen!" << endl; return 0;} outfile << "hi" << endl; outfile. dichtbij();
Als MyFile. txt bestaat niet wanneer u deze code uitvoert, krijgt u het bericht Kon het bestand niet openen! Maar als MyFile. txt bestaat, de applicatie opent het, voegt de string hallo toe, en tenslotte sluit het.
Het blijkt dat de vlag nocreate niet beschikbaar is in de nieuwe standaardbibliotheek. Jammer. Daarom werkt de code alleen als u een eerdere versie van de bibliotheek gebruikt. Bij gebruik van de code:: blokkeert de compiler, ziet u het volgende foutbericht:
fout: 'nocreate' is geen lid van '; std:: ios '
U wilt echter testen of uw specifieke compiler een bibliotheek bevat die ios ondersteunt:: nocreate.Uw compiler ondersteunt dit hoe dan ook, zelfs als deze de nieuwe standaardbibliotheek bevat. Als een alternatief voor ios:: nocreate, kunt u de volgende code gebruiken (gevonden in het voorbeeld FileOutput02):
ifstream infile ("… / MyFile. Txt"); if (infile. fail ()) {cout << "kon het bestand niet openen!" << endl; return 0;} infile. dichtbij(); ofstream outfile ("… / MyFile. txt", ios:: app); uitbesteden << "hi" << endl; outfile. dichtbij();
In dit geval begint u met het openen van het bestand om te lezen. Als het bestand niet bestaat, kunt u er niet vanaf lezen en wordt de code afgesloten met een foutbericht. Als de code uit het bestand kan lezen, wordt het bestand opnieuw geopend om te worden geschreven. Dit is een omslachtige oplossing, maar het werkt.
Hieronder volgt een lijst met beschikbare vlaggen. Ten eerste, hier zijn degenen voor ios, voor het geval u een compiler gebruikt die niet volledig ANSI-compliant is:
-
ios:: app: deze vlag betekent dat u een bestand wilt openen en eraan wilt toevoegen.
-
ios:: in: voeg deze vlag toe als u vanuit een bestand wilt lezen.
-
ios:: out : Neem deze vlag op als u naar een bestand wilt schrijven.
-
ios:: trunc : Neem deze vlag op als u de inhoud van het bestand wilt wissen voordat u ernaar schrijft. Het is het tegenovergestelde van append, en het is ook de standaard als je ios:: app niet specifiek toevoegt.
-
ios:: nocreate : Gebruik deze vlag als u ervoor wilt zorgen dat het bestand niet wordt gemaakt als het niet bestaat, waardoor het bestand niet wordt geopend.
-
ios:: noreplace : Deze vlag is het tegenovergestelde van nocreate. Gebruik deze vlag als u alleen een nieuw bestand wilt maken. Als u deze vlag gebruikt en het bestand al bestaat, wordt het bestand niet geopend en geeft die fout true .
ANSI-compilers ondersteunen de ios: noreplace-vlag ook niet. In dit geval kunt u het tegenovergestelde van de fix gebruiken voor de vlag ios: nocreate, zoals hier wordt weergegeven (en gevonden in het FileOutput03-voorbeeld):
ifstream infile ("… / MyFile. Txt"); if (! infile. fail ()) {cout << "het bestand bestaat al!" << endl; return 0;} infile. dichtbij(); ofstream outfile ("… / MyFile. txt"); uitbesteden << "hi" << endl; outfile. dichtbij();
In dit geval probeert de code het bestand te openen voor lezen. Als het bestand bestaat, geeft de code een foutmelding en wordt afgesloten. Anders maakt de code een nieuw bestand en schrijft het ernaar.
De volgende vlaggen zijn beschikbaar in een complier die absoluut ANSI-compliant is!
-
ios:: at: gebruik deze vlag om naar het einde van het bestand te gaan nadat je het hebt geopend. Normaal gesproken gebruikt u deze vlag wanneer u gegevens aan het bestand wilt toevoegen.
-
ios_base:: binary: gebruik deze vlag om op te geven dat het bestand dat u opent binaire gegevens bevat, dat wil zeggen gegevens die geen tekenreeksen vertegenwoordigen.
-
ios_base:: in: geef deze vlag op wanneer u vanuit een bestand wilt lezen.
-
ios_base:: out: Neem deze vlag op wanneer u naar een bestand wilt schrijven.
-
ios_base:: trunc: voeg deze vlag toe als u de inhoud van een bestand wilt wissen voordat u ernaar schrijft.
-
ios_base:: app: voeg deze vlag toe als u aan het bestand wilt toevoegen. Het is het tegenovergestelde van trunc - dat wil zeggen, de informatie die al in het bestand staat wanneer je het opent, blijft daar staan.
Waarom heb je een in-vlag en een uit-vlag nodig? Het lijkt erop dat de computer moet weten of u naar een bestand schrijft of leest, afhankelijk van (respectievelijk) of u stream of ifstream gebruikt. Het antwoord op waarom u een in-vlag en een uit-vlag heeft, is dat andere klassen naast ofstream en ifstream beschikbaar zijn.
De compilers die de ANSI-standaard nog niet volledig ondersteunen, hebben een generieke klasse in hun bibliotheken die fstream worden genoemd. De ANSI-compilers hebben in hun bibliotheken een template-klasse met de naam basic_filebuf en een klasse genaamd filebuf. Als u deze klassen gebruikt, kunt u de in en uit-vlaggen gebruiken.