2016-07-23 15 views
-1

ich Probleme, mich bei dem Versuch, eine ganze Zahl aus einer Textdatei zu lesen:haben Schwierigkeiten eine ganze Zahl von einer Datei in C Lesen

#include <stdio.h> 
#include <string.h> 

int main() 
{ 
    int op; 

    /* Open file for both reading and writing */ 
    FILE *d = fopen("intento1.txt", "r"); 
    FILE *f = fopen("bubbletry.txt", "w+"); 

    /* Read and display data */ 
    fread(&op, 4, 1, d); 

    printf("%d\n", &op); 
    fclose(d); 
    /* Write data to the file */ 
    fprintf(f,"%d\n",&op); 

    fclose(f); 

    return(0); 
} 

Die erste Zahl bei „intento1.txt“ ist 30771, aber Der unter "bubbletry.txt" geschriebene Text lautet 926363699. Können Sie mir sagen, warum das passiert?

Antwort

3

In der Regel zum Lesen von Integer oder dergleichen können Sie stattdessen fscanf verwenden. Es ist viel bequemer als fread.

fscanf(fp, "%d", &n); 

Ein Beispiel überprüfen http://www.cplusplus.com/reference/cstdio/fscanf/

+0

Danke! : D das war sehr hilfreich –

+1

fread ist es, Binärdaten zu lesen. fscanf dient zum Behandeln von Binärdaten als das gewünschte Format –

5

Weil die ersten 4 Bytes intento1.txt lesen, '3', '0', '7' '7', in eine ganze Zahl. '3' ist 0x33, '0' ist 0x30, '7' ist 0x37. Sie lesen also in 0x33303737, aber da Sie sich in einer Small-Endian-Architektur befinden, werden die Bytes auf 0x37373033 umgedreht, was die hexadezimale Darstellung von 926363699 ist, deren ASCII-Darstellung Sie in der Datei mit fprintf dort ausdrucken.

Was Sie wollen, ist das Scannen der Ganzzahl aus der Ascii-Darstellung, entweder indem Sie die Zeichenfolge einziehen und konvertieren oder etwas wie fscanf verwenden. Denken Sie daran, dass die Binärdarstellung einer Zahl nicht mit ihrer ASCII-Darstellung übereinstimmt.

1

Zusätzlich zu der Antwort bezüglich der Verwendung von fread() haben Sie die beabsichtigten Argumente für Ihre Funktionen nicht korrekt übergeben. Während fread() erfordert einen Zeiger als Argument (auf die Variable zeigen) zum Einlesen, beide printf() und fprintf() erfordern die Wert (nicht die Adresse!) Des formatierten Arguments gedruckt werden. So ist die gleiche Syntax in Argumentübergabe funktioniert für beide Funktionen:

printf("%d\n", op); 

fprintf(f,"%d\n", op); 

Sie auch nützlich finden diese SO Beiträge zu lesen: fread, reading text files with fread, fprintf.