0

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);

メモリ内にバッファの別のコピーを作成した理由は、サイズだけでなく実際のビット データを比較できるようにするためです。したがって、書き込まれるデータが読み取られるデータと同じであることがわかります。

4

2 に答える 2

6

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

memcpy代わりにandを確認する必要がありますmemcmp。これは、バッファーを 0 で終了する文字列として解釈しません。

于 2011-01-11T13:20:08.473 に答える
1

strcpy は最初の '\0' 文字までしかコピーしないため、代わりに memcpy を使用する必要があります。これは、バイナリ ファイルではうまく機能しません。本当の問題は、なぜファイルの内容をメモリにコピーしたいのかということです.元のバッファを新しいファイルに書き出すことができます。

于 2011-01-11T13:22:06.053 に答える