在修復了fopen
問題後,您可能需要查看fread
和fwrite
,它可以在二進制讀取/寫入時提供一些額外的錯誤檢查。
雖然沒有什麼錯讀/二進制在二進制一次寫一個字符,文件流的輸入/輸出你有附加功能fread
和fwrite
,使您可以讀取和寫入字節的特定號碼(或任何其他size
值,例如int
等)。基本語法是:
size_t fread (void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t fwrite (const void *ptr, size_t size, size_t nmemb,
FILE *stream);
所以不是:
for (int i=0; i<5; i++){
fputc(fgetc(bmpFile), encodedFile);
}
你可以使用fread
和fwrite
,讓你驗證'size'
讀元素的數量和書面:
unsigned char buf[5] = {0};
if (fread (buf, 1, 5, bmpFile) == 5) {
if (fwrite (buf, 1, 5, encodedFile) != 5)
fprintf (stderr, "error: fwrite failed for encodedFile.\n");
}
else
fprintf (stderr, "error: fread failed for bmpFile.\n");
一個簡單的例子可能是:
#include <stdio.h>
int main (int argc, char **argv) {
FILE *in, *out;
unsigned char buf[8] = {0};
unsigned char chr[8] = {0};
size_t i;
if (argc < 3) {
fprintf (stderr, "error: insufficient input. prog infile outfile (binary cp)\n");
return 1;
}
if (!(in = fopen (argv[1], "r+b")) || !(out = fopen (argv[2], "w+b"))) {
fprintf (stderr, "error: file open failed.\n");
return 1;
}
if (fread (buf, 1, 5, in) == 5) {
if (fwrite (buf, 1, 5, out) != 5)
fprintf (stderr, "error: fwrite failed for encodedFile.\n");
}
else
fprintf (stderr, "error: fread failed for bmpFile.\n");
rewind (in);
rewind (out);
if (fread (buf, 1, 5, in) != 5 || fread (chr, 1, 5, out) != 5) {
fprintf (stderr, "error: read after rewind failed.\n");
return 1;
}
fclose (in);
fclose (out);
for (i = 0; i < 5; i++)
printf (" actual : %3hhu value : %3hhu\n", buf[i], chr[i]);
putchar ('\n');
return 0;
}
實施例/輸出
$ ./bin/freadfwrite bin/xpathfname bin/ytestout
actual : 127 value : 127
actual : 69 value : 69
actual : 76 value : 76
actual : 70 value : 70
actual : 2 value : 2
' 「RWB」' - >' 「R + B」' – Dmitri
** [倒帶](http://www.cplusplus.com/reference/cstdio/rewind /)** – amdixon
對於二進制讀/寫,你應該看看'fread'和'fwrite'。你可能會發現它們更適合這項任務。 –