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呼び出しの1つが失敗しました。あなたは彼らが成功したかどうかをわざわざチェックしませんでした。

失敗するfopenと、nullポインタが返されます。その後それを使おうとすると、プログラムが爆撃する可能性があります。

次に、Blagovestで説明されているバグを修正する必要があります。もちろん、ファイルを閉じる必要があります。

于 2011-09-30T12:45:50.487 に答える
4
  1. chとして宣言する必要がありますintそれ以外の場合は、文字ÿが表示されたときにファイルの処理が停止します。char256の異なる値しかとることができません。これは、256の異なる記号とEOF文字には不十分です。EOF-14,294,967,295として扱われる場合と同等ですが、として扱われる場合とint同等です。入力ファイルに文字ÿが含まれている場合(基本的に、またはとして扱われる場合)、ステートメントはtrueになり、ループは中断されます。これはあなたのエラーとはの関係もありませんが、それでも重要です...255char-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

fgetcintではなく、を返しますchar。その目的は、EOF読み取られた文字からそれを返し、区別できるようにすることです。

chとして宣言するだけintです。

于 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が失敗したためである可能性があります。私のgccでうまく機能しています

于 2011-09-30T12:52:41.790 に答える
-1

chは整数でなければなりません。man fgetcおよびを参照してくださいman putc

于 2011-09-30T12:50:00.880 に答える