2011-09-30 63 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