2017-11-03 10 views
3

Ich kann nicht verstehen, wie EOF funktioniert und WIE kennt mein PC die Größe einer Datei.Gleiche Datei mit unterschiedlicher Größe fprintf auf Linux

Zum Beispiel habe ich 3 Dateien, test0, test1 und test2. I erstellt TEST0 und test1 auf diese Weise:

int main(void) { 

    /* */ 
    FILE* fp0 = fopen("/home/kevin/eclipse-workspaceC/FileMangment/src/test0", "w+"); 
    FILE* fp1 = fopen("/home/kevin/eclipse-workspaceC/FileMangment/src/test1", "w+"); 


    if (!fp0 || !fp1) { 
     fprintf(stderr, "file pointer points to NULL\n"); 
     return 1; 
    } 

    fprintf(fp0, "abcd"); 
    fprintf(fp1, "abcd\n"); 

    fclose(fp0); 
    fclose(fp1); 

    return 0; 
} 

Dann habe ich test2 mit der rechten Maustaste -> neue Dokumente und in der Datei schrieb ich:

abcd 

Ohne einen Raum noch eine neue Zeile Am Ende. Dann auf der bash lief ich den Befehl: wc -c test*; file test* und die Ausgabe:

4 test0 
5 test1 
5 test2 
14 total 
test0: ASCII text, with no line terminators 
test1: ASCII text 
test2: ASCII text 

Wenn ich die Dateien mit gedit beobachten sie (keine neue Linien gegründet) identisch zu sein scheinen.

Ich weiß, dass \n Newline ist und nicht EOF (Und ich kann wirklich nicht verstehen, was ist das EOF), also WIE weiß mein PC, wenn die Datei endet? Wenn die Größe des Festplattenblocks 4K ist, warum stoppt es dann nach der korrekten Anzahl von Bytes und liest nicht weiter, was danach kommt?

Warum sehe ich Tonnen von Codes, die eine Datei auf diese Weise analysiert:

while((c=fgetc(infile))!=EOF){ 
putchar(c); 
} 

Dies bedeutet also, dass es irgendwo ein Zeichen genannt (EOF) ??????? Aber ich kann es nicht in Ascii Tabelle finden. Und ich fand, dass Wert -1 ist .... Sehr sehr sehr verwirrend ...

Ist mein PC, der jede Datei analysiert, um zu wissen, ist Größe oder es irgendwo geschrieben?

Irgendwo in meinem Computer muss das sein:

your file at position xyz has the size of blahblah... 

Wo ist dieser Ort? oder was soll ich googlen? Weil ich etwas wie 3Gozzilion von Dingen gegooglet habe wie: wo ist meine Dateigröße gespeichert usw. ... und habe nichts gefunden. Ich möchte nur wissen, wo diese Informationen gespeichert sind.

+1

Die Dateiinformationen im Dateisystem haben die tatsächliche Größe der Datei (verwendete Bytes). Die E/A-Bibliothek und/oder das Betriebssystem verwenden dies, um zu begrenzen, was Sie aus der Datei lesen können. –

+3

Es gibt kein Zeichen, das ein'EOF' ist. 'fgetc' gibt kein' char' zurück. Es gibt ein Zeichen zurück, das am Ende der Datei zu "int" oder "EOF" hochgestuft wird. – MFisherKDX

+0

"WIE weiß mein PC, wann die Datei endet?" Die Dateilänge, Erstellungs-/Änderungszeitpunkt, Dateiname usw. werden an anderer Stelle gespeichert. Diese Metadaten werden oft im Ordner/Verzeichnis gespeichert. – chux

Antwort

2

Unter UNIX entspricht jede Datei einer Inode-Nummer des Dateisystems. In diesem Inode können Sie verschiedene Informationen über die Datei finden, einschließlich der Dateigröße. Sie können mehr Informationen finden Sie hier: Overview of the Linux file system

1

auf einem Unix-System, wenn Sie wie einen Befehl

ls -l 

der Ausgang ist etwas ähnlich wie diese

-rw-r--r-- 1 user group  393 Nov 3 22:02 README.txt 

diese Dateiberechtigungen enthält, Inhaber , Gruppengröße, erstellte Zeit, Dateiname usw. usw.

auf Dateisystemebene werden diese Informationen in einem Inode gespeichert und eine Struktur, die die Datei-Metadaten repräsentiert, wobei jede Datei selbst durch eine Inode-Nummer repräsentiert wird.

auf einer sehr hohen Ebene erhöht jeder Leseaufruf die Cursorposition, um Bytes zu lesen. und irgendwann wird dies die Größe der Datei erreichen.In diesem Fall gibt der Leseaufruf möglicherweise nicht einmal die angeforderte Anzahl an Dateien zurück. zum Beispiel

beobachten Sie diesen Leseaufruf unten, wo wir versuchen, Größe Anzahl der Bytes aus der Datei durch den Dateideskriptor fd dargestellt zu lesen.

int nbytes = read(fd, buf, size); 

jedoch ist es durchaus möglich, dass nBytes < Größe sein kann, wobei in diesem Fall die meisten Zeiten nächsten nachfolgenden Leseaufruf mit EOF fehlschlagen kann (wenn das Ende der Datei erreicht ist). Es gibt jedoch auch andere Szenarien, in denen nbytes nicht gleich groß sein kann.

Verwandte Themen