ifstream in(\"test.txt\", ios::in); if (!in) { printf(\"Error: Can\'t open file\"); }
Hvilken member-funktion i \"in\" gør det egentlig muligt at \"spørge på den\" i if-sætningen?? Hvis \"in\" var en pointer ville det give mening, men det er den jo ikke.
ifstream in(\"test.txt\", ios::in); // kalder ifstream (inputfilestream)\'s constructor og opretter in if (!in) { // Hvis constructoren fejlede printf(\"Error: Can\'t open file\"); }
pstric skriver: \"hvis constructoren fejlede\" hmmm... lyder mystisk! Så vidt jeg ved returnerer en constructor ikke nogen værdi - eller tager jeg helt fejl? Det var DET jeg undrede mig over.
Jamen clone, det er jo også idéen i en constructor. Du giver constructoren de parametre, den skal bruge og så opretter den et nyt objekt af den angivne type.
I dette tilfælde er parametrene en \'const char *\' og en \'ios_base::openmode\' og in bliver tildelt et nyt objekt af typen ifstream.
Hvis ifstream constructoren ikke kan åbne den angivne fil (den kalder open()), så opretter den ikke et nyt objekt, og lader være med at tildele en værdi til in. Derfor kan du efter kaldet til constructoren afgøre om objektet blev oprettet ved at undersøge om værdien af in = null (i linien if (!in)).
Jeg har en klasse som jeg bruger til at parse en tekst-fil med. Denne klasse indeholder en C FILE pointer, som jeg bruger til at indlæse data fra tekst-filen. Jeg opretter objektet med følgende kode:
CMyInFile inFile; // create infile object
Klassens constructor sørger for at oprette en filehandle ud fra ovenstående pointer. Hvis ikke filen kan åbnes med fopen() så er min fil-pointer NULL. Det som mit egentlige spørgsmål drejer sig om er, at jeg gerne vil have mulighed for at checke om filen er åben på samme måde som den metode jeg beskrev i første indlæg. Altså:
CMyInFile inFile; // create infile object if (!inFile) { printf(\"Error: Can\'t open file\"); }
Hej For lige at svare på dit første indlæg. Årsagen til at det kan lade sig gøre at bruge udtrykket: if(!in)... er at alt der er databærende i C++ (variabler, instanser, pointere, osv.) kan evalueres til enten sandt eller falsk. da \"in\" i dette tilfælde er en instans af objektet ifstream, kan der evalueres på det. Hvis det lykkedes at instantiere instansen er det \"true\" ellers er det NULL eller \"false\". Konstruktøren i ifstream er skruet sammen således at den kun returnerer et nyt objekt hvis den pågældende fil i første inputparameter findes, og kan åbnes. Og ja... implicit returnerer en kontruktør et objekt af selv sig. Returneringen er transparant for brugeren af konstruktøren, men hvis du lige leder tanken hen på \"this\", vil du sikkert se ideen. Lige så snart konstruktøren går ud af scope, returneres \"this\" til ejeren af objektet. Bjarne Stoustrup har forklaret princippet i konstruktøren i flere af hans bøger.
Dit sidste indlæg: Den metode jeg selv benytter er en temporær ifstream instans i en try-catch blok.
herefter vil du kunne spørge på: if(!infile.TestFile(\"testfile.txt\") { cout << \"Could not open testfile.txt\" << endl; } else { ...instantier FILE objektet.... }
Det kan IKKE lade sig gøre at lave en constructor som ikke opretter en instans af klassen !!! Hvad man derimod kan lave, er at overloade ! og != (not og not equal) operator\'erne for klassen, sådan at d.o. check på !in giver mening - nemlig at det filehandle, som givet ligger \"inde i\" ifstream klassen er NULL.
Følgende eksempel viser teknikken (grader Kelvin kan ikke være negative, derfor betragtes instanser hvor temperatur er mindre end 0 så \"ikke oprettede\"):
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.