putc给出分段错误?
下面的代码给出了分段错误…为什么?????使用fputc尝试的事件 我想我可能犯了一个愚蠢的错误,但我没有足够的时间 请帮忙putc给出分段错误?,c,file,file-handling,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"
#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;
}
#包括
int main(){
//系统(“sudo openssl enc-base64-in file.txt-out file.txt.enc”);
文件*fp,*fq;
char ch;
fp=fopen(“file.txt.enc”,“r”);
fq=fopen(“output.txt”,“w”);
而((ch=fgetc(fp))!=EOF)
putc(ch,fq);
返回0;
}
可能是您的fopen
调用失败。你没有费心去检查他们是否成功
当fopen
失败时,返回空指针。如果你试图在以后使用它,那么你的程序很可能会爆炸
然后,您必须修复Blagovest描述的错误,当然,您应该关闭文件。
fgetc
返回int
,而不是char
。其目的是能够返回EOF
,并将其与读取的字符区分开来
只需将
ch
声明为int
ch必须是整数。请参见man fgetc
和man putc
检查此项并阅读我的答案
您已经声明了ch as char,将其设置为int并进行尝试。它会起作用的
也许你必须检查一下fopen真正返回给你的是什么,可能是因为fopen失败了。它在我的gcc上运行良好
ch
声明为int
。否则,当字符ÿ出现时,文件的处理将停止char
只能接受256个不同的值,这对于256个不同的符号+EOF
字符是不够的EOF
是-1
,当作为int
处理时,它相当于4294967295
,但当作为char
处理时,它相当于255
。如果您的输入文件包含字符ÿ(本质上是-1
或255
当被视为有符号的),则语句ch==EOF
将变为真,而while
循环将中断。这与你的错误无关,但重要的是
NULL
指针读取/写入,因为无法读取输入文件(不存在)或无法写入输出文件(写保护)#包括
int main(){
文件*fp,*fq;
int-ch;
if((fp=fopen(“file.txt.enc”,“r”))==NULL)
返回1;
if((fq=fopen(“output.txt”,“w”))==NULL)
返回1;
而((ch=fgetc(fp))!=EOF)
putc((char)ch,fq);
返回0;
}
确保fopen
工作且未返回空指针。完成后,请在fopen
s中附带一个fclose
。我想这是第20次看到同样的问题在我的编译器上运行良好,我没有收到任何问题,但没有得到任何帮助……。此外,当我使用printf
时,即使使用char ch
也可以正常工作。您必须将ch
声明为int。但是,据我所知,此错误无法解释seg故障。我得到了解决方案。这实际上是一个权限问题。与char或int无关。但是,正如您所指定的,它可能会在将来导致错误,我将对其进行更改。(虽然它现在工作正常)。但我想知道一件事,实际上这里读取的输入文件实际上是RSA加密的结果。那么,无论我将其读取为字符还是int,它是否工作正常????我的意思是,加密标准是否也加密EOF字符。@Udit不,您确实必须使用int。它目前无法正常工作。正如许多人向您解释的那样,您的代码被破坏了。@Udit Gupta:EOF
字符没有被加密。这不是文件的一部分。你应该读书。我已经详细地回答了为什么你的代码有问题。只需将AÿB写入一个文件,看看这两个版本对它都有什么影响。
Fgetc() \\ returns a signed int value
#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;
}