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.
Tiedoston lopussa _ei ole_ mitään EOF:ia, sitä ei ole siis määritelty miksikään.
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.
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.
EOF tarkoittaa EndOfFile eli tiedoston loppua
BOF tarkoittaa BeginningOfFile eli tiedoston alkua
Jotenkin noin ne tais olla...
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.)
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.
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; }
No jopas! Nämä sivut eivät näköjään halua välimerkkejä rivien alkuun...
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.
hmm.. itsekin olen monesti kuullut "virheellistä" tietoa "EOF kirjoitetaan tiedoston suljettua tiedoston loppuun" -tyyliin C-oppaistakin.
Aihe on jo aika vanha, joten et voi enää vastata siihen.