2012-03-09 9 views
0

バイナリ形式のファイルにユーザー入力を書き込もうとしています。 バイナリ形式でファイルに書き込むときに出力が正しくない

FILE *f; 
    char array[8]; 
    f = fopen("numbers.bin", "ab+"); 
    if(f==NULL){ 
     printf("Could not open file!\n"); 
     system("pause"); 
     exit(1); 
     } 

    for(i=0;i<numberOfInputs;i++){ 
     printf("\nEnter number nr %i:", i+1); 
     gets(array); //get the input and place it in array 
     strcat(array, "\n"); // add a newline to the input 
     fwrite(array,sizeof(char),1,f); //write output to the file 
} 

は何イムを発見することができ、誰もがここで間違ってやっている

:私は0と1のを見て期待したファイルイムを見ると、そのファイルへの出力は通常のテキストで印刷されていますか?

+1

「0と1だけ」が必要ですか?あなたは何をしようとしているのですか?ユーザが数字(整数、正確には)を入力し、これらを(OS依存の)バイナリ形式で追加する必要がありますか?または、改行文字をそのまま文字列に追加したいですか? –

+0

getsを使用しないでください。あなたのファイルに8文字以上の行がある場合は、バッファオーバーフローが発生しています。 –

+0

バッファオーバーフローの理由で、現在のバージョンの標準(C11)がリリースされたときに、最近gets()がC言語から削除されました。 gets()を使用するプログラムは、将来のCコンパイラではコンパイルされません。 – Lundin

答えて

1

入力を文字列(gets)として読んでいるので、これは後でデータが書き込まれる方法です。数字を読むにはscanfを使用する必要があります。

int num; 
scanf("%d", &num); 
fwrite(&num, sizeof(int), 1, f); 
+0

ヒントを使ってコードを編集しました。ここでimは配列をループし、各要素をscanfで読み込み、 Imは読み込み不能な出力を得るので、期待どおりに動作している可能性があります。私は出力を確認したときにこれを回答として受け入れます:) –

1

あなたは1つのチャーを書くだけです。

試してみてください...

fwrite(array,strlen(array),1,f); 

これらdocsは、2番目のパラメータは書くための要素の大きさで、そして第三は項目数であることを示しています。あなたはこれらの2つを逆に置くか、1の代わりにsizeof(char)を入れます(これは常に1です)。

改行文字とヌルターミネータもメモリを占有しているため、ユーザーが6文字以上の文字列を入力すると問題が発生することに注意してください。

+0

上記のコードはうまくいきましたが、メモ帳でファイルを表示しているときに「通常の」テキストで表示されます –

関連する問題