0

以下代码给出分段错误....为什么????? 使用 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;

    }
4

5 回答 5

4

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

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

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

于 2011-09-30T12:45:50.487 回答
4
  1. 您必须声明chint. 否则,文件的处理将在字符ÿ出现时停止。只能取 256 个不同的值,这对于 256 个不同的符号 +字符char是不够的。is ,相当于当被视为 an 时,但它相当于当被视为 a 时。如果您的输入文件包含字符ÿ(本质上或被视为),则该语句将变为 true,并且您的循环将中断。这与您的错误无关,但它仍然很重要......EOFEOF-14,294,967,295int255char-1255signedch == EOFwhile

  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;

}
于 2011-09-30T13:17:07.633 回答
2

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

只需声明chint.

于 2011-09-30T12:46:57.307 回答
0

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

     Fgetc() \\ returns a signed int value

并且您已将 ch 声明为 char 并将其设为 int 并尝试一下。它会起作用 可能您必须检查 fopen 真正返回给您的内容,可能是因为 fopen failed 。它在我的 gcc 上运行良好

于 2011-09-30T12:52:41.790 回答
-1

ch 必须是整数。见man fgetcman putc

于 2011-09-30T12:50:00.880 回答