2011-09-30 60 views
0

以下代碼給出了段錯誤....爲什麼?事件嘗試與fputcputc給出分段錯誤?

我想可能有一個愚蠢的錯誤,我無法得到..但沒有ENOGH時間。

請幫助...

#include <stdio.h> 

    int main() { 

    //  system("sudo openssl enc -base64 -in file.txt -out file.txt.enc"); 

    FILE *fp,*fq; 
    char ch; 

    fp = fopen("file.txt.enc","r"); 
    fq = fopen("output.txt","w"); 

    while((ch=fgetc(fp)) != EOF) 
      putc(ch,fq); 

    return 0; 

    } 
+0

確保'fopen'工作並沒有返回NULL指針。完成後還要附帶'fclose'。 – Joe

+0

我想這是第20次看到相同的問題 – niko

+0

正常工作我的編譯器我沒有問題 – niko

回答

3
  1. 其工作的罰款您必須聲明chint。否則,當字符ÿ出現時,文件的處理將停止。 char只能取256個不同的值,這對於256個不同的符號+ EOF字符是不夠的。 EOF-1,相當於當作爲int處理時爲4,294,967,295,但當作爲char處理時,它相當於255。如果您的輸入文件包含字符ÿ(實質上-1255當作爲signed處理)時,語句ch == EOF將成爲true並且您的while循環將中斷。這有什麼,與你的錯誤,但重要的是仍然...

  2. 如果你的程序崩潰,它會嘗試從讀/寫指針NULL因爲輸入文件無法讀取(沒有按不存在)或輸出文件無法寫入(寫保護)。

嘗試:

#include <stdio.h> 

int main() { 

    FILE *fp,*fq; 
    int ch; 

    if((fp = fopen("file.txt.enc","r")) == NULL) 
     return 1; 

    if((fq = fopen("output.txt","w")) == NULL) 
     return 1; 

    while((ch=fgetc(fp)) != EOF) 
     putc((char) ch, fq); 

    return 0; 

} 
+0

我得到了解決方案。它實際上是一個許可問題。有人正在做char或int。但是,正如你指定它可能會導致錯誤在將來我會改變它。 (雖然它現在工作正常)。但我想知道一件事實際上這裏讀取的輸入文件實際上是RSA Encryption的結果。因此,它是否能正常工作,無論我將它讀作字符還是int?我的意思是加密標準也加密了EOF字符。 –

+1

@Udit不,你真的必須使用int。目前它工作不正常。正如許多人向您解釋的那樣,您的代碼已被破壞。 –

+0

@Udit Gupta:'EOF'字符沒有被加密。它不是該文件的一部分。你應該閱讀[this](http://en.wikipedia.org/wiki/End-of-file)。我已經擴展了我的答案,解釋爲什麼你的代碼有問題。只需將* A * B *寫入文件並查看兩個版本對它的作用。 – Dennis

4

可能是你fopen調用一個失敗。你沒有麻煩去檢查他們是否成功。

fopen失敗時,返回空指針。如果你嘗試使用它,那麼你的程序可能會炸彈。

然後,您將不得不修復Blagovest描述的錯誤,當然,您應該關閉文件。

2

fgetc返回int而不是char。這樣做的目的是能夠返回EOF並將其與讀取的字符區分開來。

只需聲明ch作爲int

+0

嘗試過但沒有幫助.......當我使用'printf'其工作正常,即使'char ch' –

+2

您必須將'ch'聲明爲int。但是,這個錯誤並不能解釋seg故障,因爲我明白這一點。 –

-1

ch必須是整數。見man fgetcman putc

0

檢查了這一點,並宣讀我的回答http://www.cplusplus.com/reference/clibrary/cstdio/fgetc/

 Fgetc() \\ returns a signed int value 

,並已申報通道爲char使其int和嘗試。它會起作用 也許你必須檢查fopen返回給你的是什麼,可能是因爲fopen失敗了。在我的gcc