2016-08-09 49 views
-1

所以,這是竊聽我迄今爲止章異常在Parser.exe在(ntdll.dll中)拋出:訪問衝突讀取位置

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; 
} 

我得到的編譯,運行和執行後,下面的錯誤此功能:

在Parser.exe中0x00007FFCA1DEEAC5(ntdll.dll)引發的異常:0xC0000005:訪問衝突讀取位置0xFFFFFFFFFFFFFFFF。

我剛剛將這個項目從Code :: Blocks轉換爲Visual Studio 2015,添加了legacy_stdio_definitions.lib等等,所以這也不是問題,但代碼可以在code :: blocks中正常工作。 感謝大家提前。

+0

'炭線[30]' - '與fgets(線,150 ...' - 嘗試東西10磅土豆到5磅袋 – PaulMcKenzie

+0

的明顯的錯誤是,你的字符數組是?如果行大於30個字符,會導致未定義的行爲,但可能還有其他問題,因此請發佈[mcve]。另外,我不確定是否使用Visual Studio編譯了此實際代碼 - VS 2015'C '編譯器仍然是C89/90標準,你不能在函數塊中間聲明變量 – PaulMcKenzie

+0

@PaulMcKenzie:那是不正確的,VS已經C89很長時間了,現在幾乎所有的C99但tgmath.h和複雜。是的,它包括聲明混合代碼。 – librik

回答

0

首先,char line[30]可以包含最大值30 char s,但您試圖通過執行fgets(line, 150, fPointer);來寫入更多的值。

此外,您不檢查是否fopen成功或失敗。而且您還應該檢查fgets是成功還是失敗。

此外,您可以在函數內部聲明fPointer,而不是將其作爲函數參數。它應該是FILE *

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

我在這段代碼中得到這麼多的錯誤,我相信我缺少一些包括,我應該添加什麼比stdio.h stdlib.h,string.h; NULL,EOF和stderr給我錯誤 – Ata

+0

'stdio.h'是你在這個函數中所需要的所有東西。不過,在我的代碼中有一些錯誤。我糾正了他們。你現在可以檢查嗎? – sps

+0

我仍然在你的代碼中出現錯誤,但是我改變了一些東西,在使用vs時我仍然在標題中看到錯誤,但是它對我的.exe非常有用,所以這對我來說已經很接近了。謝謝! – Ata

相關問題