コンテンツをあるファイルから別のファイルに移動しようとしています。
私のコード:
char *path = extractFileName(args[1]);
if (path == 0)
return -1;
FILE *input = fopen(path, "r");
rewind(input);
fseek(input, 0L, SEEK_END);
long sz = ftell(input);
printf("sz: %ld\n", sz);
rewind(input);
size_t a;
FILE *result = fopen("result.mp3", "w");
size_t counter = 0;
char buffer[128];
while ((a = fread(&buffer[0], 1, 128, input)) != 0) {
fwrite(&buffer[0], 1, a, result);
counter += a;
}
printf("%d\n", counter);
printf("ferror input: %d\n", ferror(input));
printf("feof input: %d\n", feof(input));
実行後、印刷します
sz: 6675688
25662
ferror input: 0
feof input: 16
私の知る限り、Cは入力ファイルのサイズが665kbであることを知っていますが、25662バイトを超えて読み取ろうとするとeofを返します。私が間違っているのは何ですか?
出力ファイル名はですので、result.mp3
非テキストデータを扱っているのは間違いありません。つまり、ファイルをバイナリモードで開く必要が"rb"
あり"wb"
ます。このコードをWindowsで実行している場合、それを行わないと、表示されている動作が説明されます(そのプラットフォームでは、テキストモードで特定のバイト(0x1A)を読み取ると、実際にはファイルの終わりではない場合でも、ファイルの終わりを通知します)、バイナリモードを使用すると修正されます。他のOSでは、これは何の操作でもありませんが、読者にあなたの意図と使用する予定のデータの種類を教えてくれるので、厳密に必要とされていなくても良い考えです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加