2016-04-04 18 views
2

現在、バイナリファイルから256バイトを読み込もうとしていますが、プログラムを実行しているときに出力が得られません。私はこれについて間違っているところで少し混乱しています。各バイトをcharとして読み込み、長さ256のchar配列として格納しようとしています。私はすでに同様の質問をレビューしており、これまでのところ運がありませんでした。以下のコードの簡略化されたバージョン:C:バイナリファイルからバイトを読み取る

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

int main(int argc, char *argv[]){ 
    FILE *binary = fopen(argv[1], "rb"); 
    char bytesFromBinary[256]; 

    fread(&bytesFromBinary, 1, 256, binary); 
    printf("%s", bytesFromBinary); 
    return 0; 
} 
+9

*バイナリ*を読み込み、*文字列*形式指定子を使用して印刷しようとしています。バイナリデータがヌルバイトで始まるか、またはバイトがすべて印刷不能な値である場合、どの出力を期待しますか?あるいは、もしそれらのバイト*がヌルターミネータを含んでいないと 'printf'がどこで停止するのかを伝えないとどうなりますか? –

+1

配列を繰り返し、配列の各値を数値として出力すると、拡張または制限されたASCII文字は解釈されず、整数値として解釈されるため、配列内の内容を確認するのに役立ちます。 – callyalater

+0

ファイルの実際の内容は何ですか?スニペットを投稿できますか? –

答えて

2

freadの基本的な使用法は、あなたが読もうとした内容を読み取ることを検証するために期待されるバイト数と比較して戻り値をチェックします。リターンを保存すると、部分的な読み込みも処理できます。

以下の最小の例では、(ファイルが指定されていない場合、デフォルトで、またはstdinbufに最初の引数として与えられたファイルから一度に16バイトを読み取り、次いで、HEX形式でstdoutに各値を出力します。

#include <stdio.h> 

#define BUFSZ 16 

int main (int argc, char **argv) { 

    unsigned char buf[BUFSZ] = {0}; 
    size_t bytes = 0, i, readsz = sizeof buf; 
    FILE *fp = argc > 1 ? fopen (argv[1], "rb") : stdin; 

    if (!fp) { 
     fprintf (stderr, "error: file open failed '%s'.\n", argv[1]); 
     return 1; 
    } 

    /* read/output BUFSZ bytes at a time */ 
    while ((bytes = fread (buf, sizeof *buf, readsz, fp)) == readsz) { 
     for (i = 0; i < readsz; i++) 
      printf (" 0x%02x", buf[i]); 
     putchar ('\n'); 
    } 
    for (i = 0; i < bytes; i++) /* output final partial buf */ 
     printf (" 0x%02x", buf[i]); 
    putchar ('\n'); 

    if (fp != stdin) 
     fclose (fp); 

    return 0; 
} 

(注:freadsizeパラメータは1のみbytes == readszリターンitemsリードの数であり、各項目はcharタイプ値の1にのみ等しくなる。)

使用例/出力

$ echo "A quick brown fox jumps over the lazy dog" | ./bin/fread_write_hex 
0x41 0x20 0x71 0x75 0x69 0x63 0x6b 0x20 0x62 0x72 0x6f 0x77 0x6e 0x20 0x66 0x6f 
0x78 0x20 0x6a 0x75 0x6d 0x70 0x73 0x20 0x6f 0x76 0x65 0x72 0x20 0x74 0x68 0x65 
0x20 0x6c 0x61 0x7a 0x79 0x20 0x64 0x6f 0x67 0x0a 

この例を見て、y何か質問があります。

0

あなたは十分長い変数を宣言していません。

宣言char bytesFromBinary[256];は256バイトを予約し、freadはすべて256バイトを埋めます。末尾には'\0'がなく、スペースがないため、メモリ内の次のものが上書き/破棄されます。それはすでにすべての種類のランダムなエラーやクラッシュにつながります。

次に、printfで印刷しようとすると、その機能はメモリを介して実行され続けるでしょう。'\0'が発生して停止するので、プログラムがそれを作成すると、短くても、何千もの(印刷できない)文字が長くてもかまいません。

変数を常に1つ長く宣言して、末尾にスペースがあるようにする必要があります。'\0'char bytesFromBinary[257];。 freadにsizeof(var)-1を使用するか、目的の長さの定数を使用して+1で宣言することがさらに効果的です。

+0

が 'bytesFromBinary [257]'に変更され、同じ出力(none) – GregH

-1

バイトブロックをCスタイルの文字列として印刷しようとしているため、失敗します。

バイナリファイルとテキストファイルの2種類があります。ファイルを読み書きするには、対応するモードでファイルを開く必要があります。あなたのファイルは、このように作成された場合

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

int main(int argc, char *argv[]) 
{ 
    FILE *binary = fopen("file.txt", "wbx"); 
    if(!binary) 
    { 
     perror("fopen()"); 
     exit(EXIT_FAILURE); 
    } 
    char bytesToBinary[256] = ":-)"; 

    fwrite(bytesToBinary, 1, 256, binary); 
    fclose(binary); 
    return 0; 
} 

あなたのコードは成功するはずです。

+0

がバイナリファイルであるためバイナリモードで開きます。 – GregH

+0

バイナリは「印刷できない文字」を意味します。とにかく印刷しようとすると、奇妙な動作が起こります。 – Aganju

+0

ここで問題となるのは、バイナリモードでは開かないということではありません。 – immibis

関連する問題