2012-03-05 9 views
1

私は疑問に思っていました。バイナリファイルから一度に1バイトずつどのように読み込みますか?例として、いくつかのバイナリファイルからバイトを1つずつ読み込んで、その正確なバイトをある出力ファイルに書きたいとします(基本的にはcpコマンドの非常に基本的な実装です)。私の現在のCコードは次のようになります。Cで "純粋な"バイトを読む

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

int main(int argc, char**argv) 
{ 
    if (argc != 2) { 
     fprintf(stderr, "Usage: %s <output file>\n", argv[0]); 
     return 1; 
    } 

    FILE *outfile; 
    outfile = fopen(argv[1], "w"); 

    unsigned char c; 
    char temp; 
    int tracker = 0; 
    // Use temp because unsigned char will never be EOF 
    while ((temp = getchar()) != EOF) { 
     c = (unsigned char) temp; 
     fprintf(outfile, "%c", c); 
    } 
fclose(outfile); 
return 0; 
} 

私はこのようなプログラムを実行します。./main output.au < sample.auしかし

(.AUはオーディオファイルです)、私はoutput.auファイルに入る全てが「の束であります^ @ "繰り返します。 sample.auオーディオファイルを再生できますが、output.auは再生できません。私はまた、2つのファイルについてdiffを(多少無意識に)実行しました。予想どおり、別々に出てきます。

ヘルプ? ありがとう!私のコードは今のように見える...返信みんなのために おかげUPDATE

-kstruct :

outfile = fopen(argv[1], "wb"); 

int c; 
while ((c = getchar()) != EOF) { 
    fprintf(outfile, "%c", c); 
} 
+0

通常、シングルバイトのアプローチではなく、Cの '純粋な'バイトのブロックを読み書きします。 – perreal

+0

@kstructあなたの更新されたコードは私に役立ちます。 – ibid

答えて

7

getchar()intを返します。 そのintをタイプcharの変数に代入すると、情報が失われます。 しないでください。

tempをintとして宣言し、キャストを取り除く。

+0

私はすべてのことに同意する意味があると思う。しかし、私はまだ問題を抱えているようです..私の更新されたコードは上に..ヘルプですか?ありがとう! – adelbertc

+0

ちょうどそれを冗談の作品 - 感謝! – adelbertc

+0

ああああ!ファイルからの入力を 'stdin'にリダイレクトしています。 'stdin'はテキストモードのストリームであり、あなたがやっていることにはあまり適していません。とにかく...入力ファイルに "^ @"がありますか? – pmg

0

は、次の修正を行います。

- outfile = fopen(argv[1], "w"); 
+ outfile = fopen(argv[1], "wb"); 


- c = (unsigned char) temp; 
+ c = (unsigned char) (char) temp; 
+0

'c'はすでに' char'ですが、新しいキャストは無用です。 pmgが上で述べたように、 'c'は' int'でなければなりませんが、その場合でも 'char'をキャストする必要はありません。 – ibid

+0

もう片方を修正した後は文字ではありません。私は、同じキャストで署名のナンセンスを絞り込んで変更するときに数回燃えました。 – Joshua

+0

'getchar'は' EOF'でなければ 'unsigned char'を' int'にキャストします。逆はうまくいくはずです。 – ibid

1

固定する必要があるものがいくつかあります。 1)STDINをバイナリとして再度開きます。 freopen(NULL, "rb", stdin); 2)出力ファイルを次のように開きます。fopen(argv [1]、 "wb"); 3)温度はの整数である必要があります。

+0

[C99標準](http://port70.net/~nsz/c/c99/n1256.html#7.19.5.4)によると、 "モードの変更が許可されている場合、 、そしてどんな状況の下で。 – pmg

+0

彼はUNIXを必要としないという条件を与えられています。 – Joshua

関連する問題