Avatar billede hclarsen Nybegynder
18. august 2009 - 21:19 Der er 12 kommentarer og
1 løsning

I/O og EOF

Hej

Jeg har to bøger om C.

I den ene står der, at hvis man har åbnet en fil i binary-mode, da kan en "integer value equal to the EOF mark be read, which would cause the routine just given to indicate an EOF condition even though the physical EOD had not been reached".

I den anden står der, at i en binær datastrøm er der fuld overensstemmelse mellem de bytes, der sendes og modtages.

Jeg tolker de to ovenstående citater for værende modstridende med hinanden. Hvad er sandt?
Avatar billede arne_v Ekspert
18. august 2009 - 21:49 #1
Den foerste er lidt ulden. Kunne vaere en Herbert Schildt bog !

Men:

I binary mode kan du godt laese en byte med vaerdien 26 (CTRL/Z) under DOS/Windows (og tilsvarende paa andre styresystemer).

Hvis du kalde fgetc saa kan den laese alle byte vaerdier 0-255, men da den returnerer int kan den ogsaa returnere et negativt tal for at markere EOF.
Avatar billede hclarsen Nybegynder
18. august 2009 - 22:33 #2
Haha, det er en bog af Schildt :-). Jeg synes faktisk han beskriver tingene ret godt. Du anbefaler måske en anden bog til at lære C/C++ fra? Hvis ja, hvilken?

Ok, men i så fald kan man også "fange" en "falsk" EOF i binary mode?
Avatar billede hclarsen Nybegynder
18. august 2009 - 22:34 #3
Iøvrigt, så har jeg ikke helt gennemskuet hvad intervallet 0-255 rent faktisk betyder. Der er 256, men svarer hvert tal til et tegn?
Avatar billede arne_v Ekspert
18. august 2009 - 22:41 #4
Den god Schildt er god til at skrive paedagogiske boeger om programmering. Jeg har selv laert C efter en af hans boeger.

Men han er ikke altid saa praecis og saa korrekt i de tekniske detaljer.

Der er flere hade sider paa nettet omkring ham og hvad han har skrevet.

Efter min mening behoever du ikke bekymre dig saa meget om det. Bare vaer forberedt paa at du senere laerer en anden version af visse ting.

----

Du kan teste paa det laeeste og sammenligne med 26 (DOS/Windows) hvis man har lyst. Det har man dog naeppe.

----

En byte kan paa et system hvor en byte er 8 bit have 256 forskellige vaerdier og hvis man betragter den som unsigned svarer det til vaerdierne 0-255.

En byte hedder saa char (unsigned char) i C.
Avatar billede arne_v Ekspert
18. august 2009 - 22:42 #5
Der oversaette saa mellem bogstaver og bytes via en encoding (ISO-8859-1, UTF-8 etc.).
Avatar billede hclarsen Nybegynder
18. august 2009 - 22:54 #6
Ok, jeg skal lige forstå det med binary/text mode før du får point.

I text-mode kan man komme til at læse en "falsk" EOF, idet man kan læse en byte med værdien 26. I binary-mode kan man være sikker på, at når man læser en byte med værdien 26, så er det EOF?
Avatar billede arne_v Ekspert
18. august 2009 - 23:46 #7
Nej.

I text mode kan du riskere at få en falsk EOF.

I binary mode er 26 bare en helt normal byte.
Avatar billede arne_v Ekspert
19. august 2009 - 00:13 #8
Demo kode:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int c;
    FILE *fp;
    fp = fopen("C:\\z.z", "wb");
    fputc('A', fp);
    fputc('\x1A', fp);
    fputc('B', fp);
    fclose(fp);
    fp = fopen("C:\\z.z", "rb");
    printf("binary: ");
    while((c = fgetc(fp)) != EOF)
    {
        printf(" %d", c);
    }
    printf("\n");
    fclose(fp);
    fp = fopen("C:\\z.z", "r");
    printf("text: ");
    while((c = fgetc(fp)) != EOF)
    {
        printf(" %d", c);
    }
    printf("\n");
    fclose(fp);
    return EXIT_SUCCESS;
}

Output:

binary:  65 26 66
text:  65
Avatar billede hclarsen Nybegynder
19. august 2009 - 00:25 #9
I text-mode læses EOF altså som 26, men hvad læses den som i binary?

Læg også et svar :-)
Avatar billede arne_v Ekspert
19. august 2009 - 00:31 #10
I text mode læses 26 som EOF.

I binary mode læses 26 som 26.
Avatar billede arne_v Ekspert
19. august 2009 - 00:32 #11
Og et svar.
Avatar billede hclarsen Nybegynder
19. august 2009 - 10:06 #12
Så EOF har ikke et integer i binary mode? Hvordan ved man så, at EOF er nået, når man har åbnet filen i binary mode?
Avatar billede arne_v Ekspert
19. august 2009 - 15:07 #13
Se eksemplet ovenfor.

fgetc returnerer -1 ved EOF, saa man kan sagtens detecte det.

Men der er ikke mulighed for en kunstig EOF i filens content.
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester