2011-12-04 9 views
0

私はCプログラミングの初心者です。私は、同じプログラムで作成したバイナリファイル(juanjo2.klb)をここで表示しようとしています。問題は、fprintf()関数を使って文字列をファイルに出力しようとしていて、fgets()を使って 'cad'文字列に文字列を書き込み、printf()関数を使って私はファイルから読み込んだ文字列を画面に表示します。fgets()がプログラムをクラッシュさせます

プログラムを実行すると、プログラムがクラッシュし、Windows(Windows 7)からプログラムが機能しなくなり、問題の解決方法が見つかったというメッセージボックスが表示されます。だから私は実際に私が正しく機能を使用していると思うので、私が間違っていることを本当に知りません。あなたの助けが必要です。ここではソースコードは次のとおりです。

#include <stdio.h> 
#include <stdlib.h> 
#include <conio.h> 

#define MAXCHARS 20 

int main() 
{ 
    char cad[MAXCHARS]; 
    FILE *pf; 
    char *nombre = "\\juanjo2.klb"; 
    if(pf = fopen(nombre, "a+b") == NULL) 
    { 
     printf("Error opening file\n"); 
     exit(-1); 
    } 

    fprintf(pf, "%s", "Hola como estas"); 

    while(feof(pf) == 0) 
    { 
     fgets(cad, 13, pf); 
     printf("%s", cad);//Here I print the string to the screen. 
    } 

    fclose(pf); //Closing file. 

    system("PAUSE"); 
    return 0; 

}

私はコードブロックIDE 10.05を使用しています。ご協力いただきありがとうございます。

+1

バイナリデータを%sで印刷することはできません。 1つは、nullで終了しない可能性があります。 –

+0

'cad'を使う前に' fgets'の戻り値を確認してください。 – Mat

+1

バイナリモードで追加するファイルを開いていて、そこからファイルを読み取ろうとしています。 – dasblinkenlight

答えて

4
if((pf = fopen(nombre, "a+b")) == NULL) 

これは古典です。

0
... 

int main() 
{ 
    . 
    . 
    . 

    if(pf = fopen(nombre, "a+b") == NULL) 
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 

@ wildplasserの回答(+1)で指摘されているように、最初の問題は上記の行にあります。


これは次のようになります。

if((pf = fopen(nombre, "a+b")) == NULL) 
     ^^^^^^^^^^^^^^^^^^^^^^^^^^^ 

は、最初にそれを持って道をPFするFILE *を割り当て、それが


NULLかどうTHENチェック、すなわち

if(pf = fopen(nombre, "a+b") == NULL) /* wrong */ 

あなたはpfをresulに設定しています`fopen(nombre、" a + b ")== NULLのtは、ブールステートメント(==)がFALSEの場合は0、真の場合は0(通常は1)になります。したがって、pfはbooleanの結果を持ち、実際のファイルポインタではありません。これはまた、pfを見ているので、もちろんifの問題を引き起こします。

pf = fopen(nomber, "a+b") == NULL; /* here to clarify == happens before = */ 

    if (pf) /* i.e. pf != 0 */ 
関連する問題