Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
putc给出分段错误?_C_File_File Handling - Fatal编程技术网

putc给出分段错误?

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"

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

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