Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: mikä EOF?

Sivun loppuun

Jouni [04.04.2003 14:59:38]

#

Tiedoston loppu siis merkataan EOFfällä? Miksikä tämä EOF on määritelty? Jos se on yksi tai useampi tavu, niin eikö ole mahdollista, että tiedostoa kirjoitettaessa huonolla tuurilla tiedoston datan keskelle tulee juuri tämä EOF? Sehän varmaan sekoittaisi tiedoston lukemisen.

thefox [04.04.2003 15:38:35]

#

Tiedoston lopussa _ei ole_ mitään EOF:ia, sitä ei ole siis määritelty miksikään.

arcatan [04.04.2003 17:07:46]

#

Mutta ASCII-merkki 26 on kuitenkin EOF, IMO. Esim. kun olen väsännyt Skede Manageriin tallennusta, niin muistaakseni skede-tallennuksen alussa lukee "SKEDE" + CHR$(26) (eli skede ja EOF) ja sen jälkeen sitten tallennuksen data. Tämä aiheuttaa sen, että jos yritän lukea tiedostoa vaikka editillä, niin ei näy muuta tekstiä kuin SKEDE.

Se, sekoittaako merkki 26 tiedoston lukemisen, riippuu tapauksesta.

thefox [05.04.2003 19:43:54]

#

Jooh, ASCIIn alkupään merkeillä on nuo omat nimensä, mutta vaikka 26:sen nimi oliskin EOF (en tiedä mikä virallinen määritelmä on, QB:n ohjeissa 26 == EOF, kun taas muunmuassa osoitteessa http://www.asciitable.com/ olevassa taulukkossa se on SUBstitute), se ei tarkoita että tiedoston loppu merkattaisiin tuolla merkillä. Kaikki oktetin arvot ovat tiedoston sisällössä käypää tavaraa, eivätkä sekoita yhtään mitään.

Kuten DSword sanoikin, riippuu tapauksesta, eli toisinsanoen softasta joka on koodattu tulkitsemaan arvo 26 EOFiksi.

Teme [05.04.2003 19:53:52]

#

EOF tarkoittaa EndOfFile eli tiedoston loppua
BOF tarkoittaa BeginningOfFile eli tiedoston alkua

Jotenkin noin ne tais olla...

Jouni [08.04.2003 20:29:02]

#

Mun isän hyllystä löyty tämmönen C-kirja (1988), jossa on kohta: EOF Denotes end-of-file. Constant is defined in stdio.h as -1.
Ei tuota tosin missään esimerkissä käytetä, enkä myöskään tajua mikä tavu voisi olla -1. Sain sen käsityksen, että EOF menee loppuun automaattisesti kun fclose():ia kutsutaan. (Ei tämä ongelmia ole aiheuttanut. Ihmettelen vaan.)

thefox [08.04.2003 21:51:27]

#

Ei sinne tiedostoon mitään EOFia mene.
Jos tavu on oktetti, ja käytetään kakkosen komplementaation (mainio suomennos? ;-) notaatiota, on -1 0xFF, eli 255.

Esim C:ssähän tuo voisi toimia jotensakin näin: koska funktiot yleensä palauttavat merkin int:inä, voidaan tehdä ero "tavallisten arvojen" (0-255) ja "EOF":in (-1, jos int 32 bittinen, 0xFFFFFFFF) välillä.

Tuo "EOF" ei liity pelkästään tiedostoihin.

Jouni [15.04.2003 21:09:02]

#

Pakko siellä tiedoston lopussa on olla joku EOF. Tämä funktio toimii:

long get_file_length(char *file) {
 long c;
 FILE *data;
 if( (data=fopen(file, "rb")) == NULL) return 0;
 else {
  while(fgetc(data)!=EOF) { c++; }
  }
 fclose(data);
 return c;
 }

Jouni [15.04.2003 21:10:16]

#

No jopas! Nämä sivut eivät näköjään halua välimerkkejä rivien alkuun...

thefox [15.04.2003 21:35:11]

#

Ei ei ei ei. fgetc palauttaa merkin int:nä, joten siihen sopii helposti merkit 0-255, näin voidaan tehdä ero EOF:in ja 255:n välillä. EOF on tässäkin tapauksessa (veikkaus) -1, eli 0xFFFFFFFF. Normaalit merkit ovat välillä 0-255. Tuo ei siis tule sieltä tiedostosta, vaan fgetc palauttaa sen kun se havaitsee ettei enää ole mitä lukea.
Katselepas niitä header-filuja (stdio.h), löytyisiköhän sieltä jotain tällaista:

#define EOF -1

Dev-C++:

/* Returned by various functions on end of file condition or error. */
#define	EOF	(-1)

fgetc:

int	fgetc (FILE*);

Huomaa paluuarvon tyyppi: int, ei char, ei unsigned char. int.

HtH [17.04.2003 19:45:52]

#

hmm.. itsekin olen monesti kuullut "virheellistä" tietoa "EOF kirjoitetaan tiedoston suljettua tiedoston loppuun" -tyyliin C-oppaistakin.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta