以下代码给出了分段错误....为什么?????用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;
}
答案 0 :(得分:4)
您的fopen
个来电之一可能失败了。你没有费心去检查他们是否成功。
当fopen
失败时,返回空指针。如果你随后尝试使用它,那么你的程序可能会炸弹。
然后你必须修复Blagovest描述的错误,当然你应该关闭你的文件。
答案 1 :(得分:3)
您必须将ch
声明为int
。否则,当出现ÿ字符时,文件的处理将停止。 char
只能使用256个不同的值,这对于256个不同的符号+ EOF
字符是不够的。 EOF
为-1
,在被视为4,294,967,295
时相当于int
,但在被视为255
时相当于char
。如果您的输入文件包含字符ÿ(当被视为-1
时基本为255
或signed
),则语句ch == EOF
将变为true并且您的while
循环将中断。这与你的错误没有有关,但它仍然很重要......
如果您的程序崩溃,它会尝试读取/写入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;
}
答案 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 fgetc
和man putc
。