2010-10-12 35 views
1
#include<stdio.h> 
#include<ctype.h> 

int main() { 

    FILE *fpin = fopen("in.txt", "r"); 
    fprintf(fpin, "hello, world!"); 
    fclose (fpin); 

    char c; 
    fpin = fopen("in.txt", "r"); 
    FILE *fpout = fopen("out.txt", "w"); 
    while ((c = fgetc(fpin)) != EOF) { 
     fputc (toupper(c), fpout); 
    } 

    fclose (fpout); 
    fclose (fpin); 
    return 0; 
} 

我得到一個寫這個文件句柄有什麼問題?

分段故障

謝謝。

+2

學會使用調試器 – pm100 2010-10-12 17:54:54

回答

10

我不知道關於C什麼,但似乎你寫你已經以只讀方式打開文件...

FILE *fpin = fopen("in.txt", "r"); 
fprintf(fpin, "hello, world!"); 

也許應該是:

FILE *fpin = fopen("in.txt", "w"); 
fprintf(fpin, "hello, world!"); 
+1

如果這不是segv,那麼您不檢查第二個fopen的返回值,因爲第一個不會創建它,第二個將會失敗,您將擁有一個在fpin中的空指針... – 2010-10-12 15:30:09

4

他們第一我看到的問題是您不檢查fopen呼叫的成功。它可能會失敗並導致fpin爲空,這將導致代碼中稍後的問題。

FILE *fpin = fopen("in.txt", "r"); 
if (!fpin) { 
    printf("Error opening in.txt"); 
    return EXIT_FAILURE; 
} 
1

最有可能的,一個你fopen呼叫失敗和返回NULL。造成這種情況的最有可能的候選者是以下行:

FILE *fpin = fopen("in.txt", "r"); 

你可能意味着在這裏使用一個"w",如您稍後嘗試寫入文件。我猜這個文件還不存在......因此,當你試圖用"r"打開它時,fopen調用失敗。

3
  1. 更改char c;int c; - fgetc返回一個int。
  2. 檢查呼叫的返回值爲fopen以查看是否獲得NULL返回值。
  3. 將第一個fopen的模式更改爲"w",以便您可以寫入該文件。
  4. 您可能要考慮在"hello world!"的末尾添加\n
+0

+1:並且我還要加上:5.編譯所有警告; 6.如果您提出問題,請更準確地描述錯誤(在哪一行發生錯誤...) – 2010-10-12 18:44:01