putc给出分段错误?

时间:2011-09-30 12:43:45

标签: c file file-handling

以下代码给出了分段错误....为什么?????用fputc尝试过的事件

我认为可能有一个愚蠢的错误,我无法得到......但是没有时间。

请帮忙......

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

    }

5 个答案:

答案 0 :(得分:4)

您的fopen个来电之一可能失败了。你没有费心去检查他们是否成功。

fopen失败时,返回空指针。如果你随后尝试使用它,那么你的程序可能会炸弹。

然后你必须修复Blagovest描述的错误,当然你应该关闭你的文件。

答案 1 :(得分:3)

  1. 您必须将ch声明为int。否则,当出现ÿ字符时,文件的处理将停止。 char只能使用256个不同的值,这对于256个不同的符号+ EOF字符是不够的。 EOF-1,在被视为4,294,967,295时相当于int,但在被视为255时相当于char。如果您的输入文件包含字符ÿ(当被视为-1时基本为255signed),则语句ch == EOF将变为true并且您的while循环将中断。这与你的错误没有有关,但它仍然很重要......

  2. 如果您的程序崩溃,它会尝试读取/写入NULL指针,因为无法读取输入文件(不存在)或无法写入输出文件(写保护)。

  3. 尝试:

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

答案 2 :(得分:2)

fgetc返回int,而不是char。这样做的目的是能够返回EOF并将其与读取的字符区分开来。

只需将ch声明为int

答案 3 :(得分:0)

检查一下并阅读我的回答http://www.cplusplus.com/reference/clibrary/cstdio/fgetc/

     Fgetc() \\ returns a signed int value

并且你已经将ch声明为char使其成为int并尝试出来。它会工作 也许你必须看看fopen真正回归给你的是什么,可能是因为fopen失败了。它在我的gcc上正常工作

答案 4 :(得分:-1)

ch必须是整数。请参阅man fgetcman putc