Frage

Wenn ich mein Programm ausführe und die Produktliste anzeigen möchte, wird nichts gedruckt.Nach einiger Zeit finde ich heraus, dass der Wert von fl_size ist immer 0.Warum ist das?

void view_prdct_code_list() {
        FILE *stock = fopen("stock.dat","r+");
        assert(stock);

        int fl_size=ftell(stock);
        int prd_size= sizeof(product);
        int quantity= fl_size/prd_size;
        printf("fl_size=%d",fl_size);

        fseek(stock,0,SEEK_SET);
        prdct cprd= (product *)malloc (sizeof(product)*quantity);
        assert(cprd);

        int i;

        fread(cprd,prd_size,quantity,stock);

        for (i=0;i<quantity;i++){
                printf("PRODUCT CODE: %d\n",cprd->code);
        }

        free(cprd);
        fclose(stock);
}
War es hilfreich?

Lösung

ftell gibt nicht die Gesamtgröße der Datei zurück;es gibt den Strom zurück Lese- oder Schreibposition innerhalb der Datei.Du rufst an ftell unmittelbar nach dem Öffnen der Datei, sodass diese Position ganz am Anfang der Datei liegt.Sie können entweder verwenden fseek(stock, 0, SEEK_END) bis zum Ende suchen, bevor man anruft ftell, oder Sie können eine Ebene ablegen und verwenden fstat(fileno(stock)) um die Dateigröße direkt vom Betriebssystem abzurufen.

Weitere Hinweise:

  1. Keine dieser Optionen funktioniert, wenn Sie aus einer Pipe lesen.(Im Allgemeinen müssen Sie den Erfolg jedes einzelnen Ihrer Dateizugriffsvorgänge überprüfen.)
  2. fread Es ist nicht garantiert, dass die gesamte Datei auf einmal gelesen wird, selbst wenn Sie dazu aufgefordert werden.
  3. Wie „alk“ betont, ftell gibt a zurück long, nicht ein int.
  4. Sie sollten diese scheinbar binäre Datei mit dem Modus öffnen "r+b".
  5. Binärdateien ohne Dateiheader (und insbesondere ohne magische Zahl, von mindestens vier Bytes, bei Offset Null) sind eine schlechte Sache.
  6. Wandeln Sie den Rückgabewert von nicht um malloc.(In C++ ist dies notwendig, aber in C ist es nicht nur unnötig, Es kann Fehler verbergen.)

Andere Tipps

Überprüfen Sie die Manpage auf ftell, zum Beispiel dieses hier: http://linux.die.net/man/3/ftell

Hier ist der relevante Teil: „Die Funktion ftell() ermittelt den aktuellen Wert des Dateipositionsindikators für den Stream, auf den stream zeigt.“

Wenn Sie die Datei öffnen, befindet sich die Cursorposition am Anfang.Der Abstand vom Start beträgt also Null.daher ftell gibt Null zurück.

Um die Größe der Datei zu ermitteln, klicken Sie auf diesen Link: Wie kann ich die Größe einer Datei in C ermitteln?.Hier ein kurzer Ausschnitt:

fseek(fp, 0L, SEEK_END);
sz = ftell(fp);

Rufen Sie unbedingt an fseek(fp, 0L, SEEK_SET); nach oben.

Weil ftell gibt die Größe vom Anfang bis zur aktuellen Position der Datei zurück.

fseek(stock,0,SEEK_SET);

Bedeutet, dass Sie die Position auf den ersten Biss der Feile einstellen.

Außerdem musst du es einstellen fl_size=ftell(stock); nach Die fseek.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top