Vertegenwoordigt EOF in C-code?

Het teken van de nieuwe regel wordt weergegeven door "\n"in C-code. Is er een equivalent voor het end-of-file (EOF) teken?


Antwoord 1, autoriteit 100%

EOF is geen teken (in de meeste moderne besturingssystemen). Het is gewoon een voorwaarde die van toepassing is op een bestandsstream wanneer het einde van de stream is bereikt. De verwarring ontstaat omdat een gebruiker EOF kan signalerenvoor console-invoer door een speciaal teken te typen (bijv. Control-D in Unix, Linux, et al), maar dit teken is niet gezien door het lopende programma, wordt het opgevangen door het besturingssysteem dat op zijn beurt EOF doorgeeft aan het proces.

Opmerking: in sommige zeer oude besturingssystemen was EOF een teken, b.v. Control-Z in CP/M, maar dit was een grove hack om de overhead van het handhaven van de werkelijke bestandslengte in bestandssysteemmappen te vermijden.


Antwoord 2, autoriteit 11%

EOFis geen teken. Het kan niet zijn: Een (binair) bestand kan elk teken bevatten. Stel dat je een bestand hebt met steeds groter wordende bytes, gaand van 0 1 2 3 … 255 en nogmaals 0 1 … 255, voor een totaal van 512 bytes. Welke van die 256 mogelijke bytes u ook beschouwt als EOF, het bestand wordt afgebroken.

Daarom getchar()et al. retourneer een int. Het bereik van mogelijke retourwaarden zijn die welke een charkan hebben, plus een echte intwaarde EOF(gedefinieerd in stdio.h). Dat is ook de reden waarom het converteren van de retourwaarde naar een charvoordatwordt gecontroleerd op EOFniet werkt.

Houd er rekening mee dat sommige protocollen “EOF” “tekens” hebben. ASCII heeft “End of Text”, “End of Transmission”, “End of Transmission Block” en “End of Medium”. Andere antwoorden hebben oude besturingssystemen genoemd. Ik voer zelf ^D in op Linux en ^Z op Windows-consoles om te stoppen met het geven van invoer aan programma’s. (Maar bestanden die via leidingen worden gelezen, kunnen overal ^D- en ^Z-tekens hebben en geven alleen EOF door als ze geen bytes meer hebben.) C-strings worden afgesloten met het teken '\0', maar dat betekent ook ze mogen het teken '\0'niet bevatten. Daarom werken alle C non-string datafuncties met een chararray (om de data te bevatten) en een size_t(om te weten waar de data eindigt).

Bewerken: de C99-standaard §7.19.1.3 stelt:

De macro’s zijn […]
EOF
die uitbreidt tot een geheel getal constante expressie, met type inten een negatieve waarde, die wordt geretourneerd door verschillende functies om
geef end-of-fileaan, dat wil zeggen, geen invoer meer van een stream;


Antwoord 3, autoriteit 10%

Nee. EOF is geen karakter, maar een status van de bestandshandle.

Hoewel er controletekens in de ASCII-tekenset zijn die het einde van de gegevens vertegenwoordigen, worden deze niet gebruikt om het einde van bestanden in het algemeen aan te geven. Bijvoorbeeld EOT(^D) wat in sommige gevallen bijna hetzelfde aangeeft.

Als de standaard C-bibliotheek een geheel getal met teken gebruikt om tekens te retourneren en -1 gebruikt voor het einde van het bestand, is dit eigenlijk alleen maar het signaal om aan te geven dat er een fout is opgetreden. Ik heb de C-standaard niet beschikbaar, maar om SUSv3 te citeren:

Als de indicator voor het einde van de bestand voor de stroom wordt ingesteld, of als de stroom op het einde van het bestand is, wordt de indicator Eind-of-File voor de stroom ingesteld en moet FETC () EOF retourneren. Als er een leesfout optreedt, wordt de foutindicator voor de stroom ingesteld, FETKC () retourneert EOF en stelt de Errno in om de fout aan te geven.


4, Autoriteit 2%

De EOFKARAKTER die wordt herkend door de opdrachtinterpreter op Windows (en MSDOS, en CP / M) is 0x1A (decimaal 26, aka CTRL + Z < / kbd>AKA SUB)

Het kan vandaag nog steeds worden gebruikt, bijvoorbeeld om het einde van een mens-leesbare koptekst in een binair bestand te markeren: als het bestand begint met "Some description\x1a"de gebruiker kan het Bestandsinhoud met de console met behulp van de opdracht TYPEen de dump stopt bij de EOF-karakter , dwz afdrukken Sommige beschrijving en stop, in plaats van door te gaan met het afval dat volgt.


5

Dit is systeemafhankelijk, maar vaak -1. Zie hier


6

Ik denk dat het van systeem tot systeem kan verschillen, maar een manier om dit te controleren zou zijn om gewoon printf

te gebruiken

#include <stdio.h>
int main(void)
{
    printf("%d", EOF);
    return 0;
}

Ik deed dit op Windows en -1werd afgedrukt naar de console. Ik hoop dat dit helpt.


Antwoord 7

De waarde van EOF kan niet worden verward met een echt teken.

Als a= getchar(), dan moeten we agroot genoeg declareren om elke waarde te bevatten die getchar()retourneert. We kunnen charniet gebruiken omdat agroot genoeg moet zijn om naast tekens ook EOF te bevatten.


Antwoord 8

Het antwoord is NEE, maar...

U kunt in de war raken vanwege het gedrag van fgets()

Van http://www.cplusplus.com/reference/cstdio/fgets/:

Leest tekens uit stream en slaat ze op als een C-tekenreeks in str totdat (num-1) tekens zijn gelezen of een nieuwe regel of het einde van het bestandis bereikt, wat het eerst gebeurt .


Antwoord 9

Er is de constante EOFvan het type int, te vinden in stdio.h. Er is door geen enkele standaard een equivalent letterteken gespecificeerd.


Antwoord 10

Ik heb veel onderzoek gedaan naar het EOF-signaal. In het boek over programmeren in C door Dennis Ritchie wordt het voor het eerst aangetroffen bij het introduceren van putchar() en getchar() commando's.
Het markeert in feite het einde van de tekenreeksinvoer.

Voor bijv. Laten we een programma schrijven dat twee numerieke invoer zoekt en hun som afdrukt. U zult na elke numerieke invoer opmerken dat u op Enter drukt om het signaal te markeren dat u de iput-actie hebt voltooid. Maar bij het werken met tekenreeksen wordt Enter gelezen als gewoon een ander teken ['\n': nieuweregelteken]. Om de beëindiging van de invoer te markeren, typt u ^Z(Ctrl + Z op toetsenbord) in een geheel nieuwe regel en voert u vervolgens in. Dat geeft aan dat de volgende commandoregels moeten worden uitgevoerd.

#include <stdio.h>
int main()
{
char c;
int i = 0;
printf("INPUT:\t");
c = getchar();
while (c != EOF)
{
   ++i;
   c = getchar();
};
printf("NUMBER OF CHARACTERS %d.", i);
return 0;}

Het bovenstaande is de code om het aantal tekens te tellen, inclusief '\n'(nieuwe regel) en '\t'(spatie) tekens. Als je de tekens van de nieuwe regel niet wilt tellen, doe dit dan:

#include <stdio.h>
int main()
{
char c;
int i = 0;
printf("INPUT:\t");
c = getchar();
while (c != EOF)
{
    if (c != '\n')
    {
        ++i;
    }
    c = getchar();
    };
printf("NUMBER OF CHARACTERS %d.", i);
return 0;}. 

NU DE BELANGRIJKSTE DENKT HOE JE INPUT KAN GEVEN. HET IS MAKKELIJK:
Schrijf al het verhaal dat je wilt, ga dan in een nieuwe regel en voer ^Z in en voer dan opnieuw in.

Other episodes