6

ファイルをバイト単位で読み取り、別のファイルに書き込もうとしています。私はこのコードを持っています:

if((file_to_write = fopen(file_to_read, "ab+")) != NULL){

  for(i=0; i<int_file_size; i++){
    curr_char = fgetc(arch_file);

    fwrite(curr_char, 1, sizeof(curr_char), file_to_write);
  }
}

ここint_file_sizeで、は読み取りたいバイト数、arch_fileは読み取り元のファイル、curr_charはcharポインターです。

ただし、これは機能しません。ループの最初の反復でセグメンテーション違反(コアダンプ)エラーが発生します。fwrite()ステートメントに何か問題があると確信しています。どんな助けでもいただければ幸いです。

4

2 に答える 2

10

それ自体ではなく、のアドレスを渡す必要があります。curr_charcurr_char

fwrite(&curr_char, 1, sizeof(curr_char), file_to_write);
//     ^------ Here
于 2012-10-21T21:28:18.267 に答える
4

curr_charcharポインタです。

その場合、

curr_char = fgetc(arch_file);

間違っている。intによって返されたfgetcを暗黙的にに変換しているchar*ので、ではfwrite、その値はアドレスとして解釈され、そこからsizeof(char*)バイトの読み取りとファイルへの書き込みが試行されます。

curr_charに割り当てられたメモリを指している場合char

*curr_char = fgetc(arch_file);
fwrite(curr_char, 1, sizeof *curr_char, file_to_write);

正しさに近いでしょう。ただし、理由ではなくを返します。失敗する可能性があります。その場合は、を返しfgetcます。だからあなたは持っているべきですintcharEOF

int chr = fgetc(arch_file);
if (chr == EOF) {
    break;  // exit perhaps?
}
char c = chr;  // valid character, convert to `char` for writing
fwrite(&c, 1, sizeof c, file_to_write);

ファイル読み取りエラーに対応します。

于 2012-10-21T21:35:54.223 に答える