2016-08-09 30 views
-1

Also, das ist das Kapitel, das mir bisher nervtException an (ntdll.dll) geworfen in Parser.exe: Zugriffsverletzung Leseort

void CNCread(fPointer){ 
    printf("\n"); 
    fPointer = fopen ("CNCG.txt", "r"); 
    char line[30]; 
    while(!feof(fPointer)){ 
     fgets(line, 150, fPointer); 
     puts(line); 
    } 
    fclose (fPointer); 
    return; 
} 

bekomme ich folgende Fehler nach dem Kompilieren, Laufen und Ausführung Diese Funktion:

Ausnahmebedingung bei 0x00007FFCA1DEEAC5 (Ntdll.dll) in Parser.exe: 0xC0000005: Zugriffsverletzungsleseposition 0xFFFFFFFFFFFFFFFF.

Ich habe gerade dieses Projekt von Code :: Blocks in Visual Studio 2015 konvertiert, legacy_stdio_definitions.lib und etc hinzugefügt, so dass das auch nicht das Problem ist, aber der Code funktionierte gut mit code :: blocks. Danke an alle im Voraus.

+0

'char line [30]' - 'fgets (Linie 150 ...' - Der Versuch, 10 Pfund Kartoffeln in einen 5-Pfund-Sack zu stopfen – PaulMcKenzie

+0

Der offensichtliche Fehler ist, dass Ihr Zeichen-Array ist? zu klein und führt zu undefiniertem Verhalten, wenn die Zeile> 30 Zeichen lang ist, aber es könnte andere Probleme geben, also bitte [mcve] .Ich bin nicht überzeugt, dass Sie diesen tatsächlichen Code mit Visual Studio kompiliert haben - der VS 2015 'C 'Compiler ist immer noch C89/90-Standard, und Sie können nicht in der Mitte eines Funktionsblocks Variablen deklarieren – PaulMcKenzie

+0

@PaulMcKenzie: das ist nicht wahr.VS ist seit langer Zeit C89, und es hat jetzt fast alle von C99 aber tgmath.h und komplex. Und ja, es enthält Deklarationen mit Code gemischt. – librik

Antwort

0

Erstens, char line[30] kann maximal 30 char s enthalten, aber Sie versuchen, mehr als das in es zu schreiben, indem Sie fgets(line, 150, fPointer); tun.

Sie überprüfen auch nicht, ob fopen erfolgreich oder fehlgeschlagen ist. Und Sie sollten auch überprüfen, ob fgets erfolgreich oder fehlgeschlagen ist.

Sie können auch fPointer innerhalb Ihrer Funktion deklarieren, anstatt es als Funktionsparameter zu haben. Es sollte vom Typ FILE * sein.

void CNCread(/* fPointer */){ 
    printf("\n"); 
    FILE *fPointer = fopen ("CNCG.txt", "r"); 

    /* Check if fopen succeded */ 
    if (fPointer == NULL) { 
     fprintf(stderr, "Error: Cannot open file to read\n"); 
     /* Some code */ 
     return; 
    } 

    char line[30]; 
    while(!feof(fPointer)){ 
     /* You are writing more chars to line than its capacity */ 
     /* fgets(line, 150, fPointer); */ 
     /* Change it to write at max 30 chars to line */ 
     if (fgets(line, 30, fPointer) != NULL) 
      puts(line); 
    } 
    if (fclose(fPointer) == EOF) { 
     fprintf(stderr, "Error: Cannot close the file after reading\n"); 
     /* Some code */ 
     return; 
    } 

    return; 
} 
+0

Ich bekomme so viele Fehler in diesem Code, die ich glaube ich fehlt einige enthält, sollte ich etwas mehr als stdio.h hinzufügen stdlib.h, string.h; NULL, EOF und stderr geben mir Fehler – Ata

+0

'stdio.h' ist alles was Sie für das, was in dieser Funktion ist, benötigen sollten. Allerdings gab es früher einige Fehler in meinem Code. Ich habe sie korrigiert. Können Sie das jetzt überprüfen? – sps

+0

ich bekomme immer noch Fehler in Ihrem Code, aber ich habe ein paar Dinge geändert, ich bekomme immer noch die Fehler im Titel während der Verwendung von vs, aber es funktioniert gut mit meiner .exe, so das ist so nah wie es richtig für mich ist. Vielen Dank! – Ata