2011-01-11 19 views
0

strcpy()関数で質問があります。私がやろうとしているのは、ユーザーがファイル名を入力して基本的にファイルを開き、内容を取得してファイルのコピーを作成することです。c strcpyファイル記述子

しかし、read()の内容がコピーする前に書かれた内容と同じであるかどうかを確認するためにエラーチェックを行うことにしました。だから、私はread()ファイルの読み込みのファイルサイズを使用して動的配列にコンテンツを読み込むので、バッファはデータの正しいサイズです。私は、別の動的バッファにそのコピーを作成し、strcmp()を使ってそれらが同じかどうかを確認したい場合はコピーバッファを出力ファイルに書き込みます。これは、特定のファイルが、ビデオファイル(MPEG)などに問題があるため正常に動作

、ビデオファイルを開くときは、エラーを取得する「ストリームの種類を判断できませんでした」、相続人のアイデア

char* buffer1 = malloc(filessize); 
char* buffer2 = malloc(filessize); 
read(file, buffer1, filesize); 
strcpy(buffer2, buffer1); //copy buffer1 into buffer2 
if(strcmp(buffer1, buffer2) == 0) 
{ 
    write(outputfile, buffer2, filesize); //write copied buffer to file 
} 
free(buffer1); free(buffer2); 

まあ理由私はメモリにバッファの別のコピーを作成したので、サイズだけでなく実際のビットデータも比較できるので、書き込まれるデータは読み込まれるデータと同じですか?

+0

バイナリモードでビデオファイルを開こうとしましたか? – programmer

+0

短い正気チェック:ファイル内容をメモリにコピーするのはなぜですか?ファイルの内容を読み込みバッファの内容で直接書き込むことができるので、これは絶対に必要ありません –

+0

あなたは正しいことをしていますか? 'str *'関数はヌルで終わる(テキスト)文字列を扱うように設計されていますが、ファイルの内容はそうではありません。たとえば、読み込みファイルに ''\ 0' '文字がある場合、最後の文字以外は完全にはコピーされませんが、'' \ 0 ''がなければ未定義の動作をします(クラッシュまたは奇妙なメッセージや...)。最初に 'memcpy'、' memcmp'などの関数を見てください。 – Vovanium

答えて

1

strcpyは最初の '\ 0'文字までしかコピーしないので、代わりにmemcpyを使用してください。これはバイナリファイルではうまく動作しません。実際の質問は、あなたがメモリ内のファイルの内容をコピーしたい理由です...元のバッファを新しいファイルに書き出すことができます。

+0

元のバッファをファイルに書き込んだ場合、どのようにチェックするのですか?つまり、ファイルに書き込まれたバッファは、ファイルから読み込まれたオリジナルデータと同じですか? – daza166

+0

読み取った同じバッファに対してバッファをチェックするのは意味がありません。それらが同じでない場合は、あなたのプログラムにバグがあります(またはあなたのハードウェアが壊れている)。自分のバグを見つけようとするのはむしろ難しいでしょう。あなたが書いたプログラムが行うべきチェックは1です。read()の戻り値です。 EOFやエラーを検出したい場合は、ファイル全体を実際に読み取ったかどうかを確認する必要があります。 2.書き込みの戻り値は、実際にファイル全体を書き込んだかどうかを確認したい場合です。 – nos

+0

書き込まれたデータが元のファイルと同じであることを確認する必要がある場合は、新しいファイルを読み戻して古いファイルと比較する必要があります。あなたがデータを書き込む前に比較すると、チャンスは書き込み時に不具合があり、とにかくそれを検出しません。 – harald

6

strcpyおよびstrcmpは、0で終了するC文字列用です。あなたのビデオファイルの値が0のバイトがあれば、そこでは停止します。

代わりにmemcpymemcmpを参照してください。これは、バッファを0の終了文字列として解釈しません。

関連する問題