2015-10-17 82 views
0

我想從一個文件的開始複製5個字節,並將它們放入另一個文件的開始。但是他們並沒有準確地複製。我認爲這個問題是在的fputc和龜etc,但不知道是什麼......fgetc和fputc在C

bmpFile = fopen("frog.bmp", "rb"); 
encodedFile = fopen("encodedFrog.bmp", "rwb"); 

for (int i=0; i<5; i++){ 
    fputc(fgetc(bmpFile), encodedFile); //copy that byte, unchanged into the output 
} 

//close and open both files, read the first 5bytes back; 
fclose(bmpFile); 
fclose(encodedFile); 
bmpFile = fopen("frog.bmp", "rb"); 
encodedFile = fopen("encodedFrog.bmp", "rwb"); 
for (int i=0; i<5; i++){ 
    unsigned int actual = fgetc(bmpFile); 
    unsigned int value = fgetc(encodedFile); 
    printf("actual: %d \tvalue: %d\n", actual, value); 
} 

這樣做的結果是:

actual: 66 value: 66 
actual: 77 value: 77 
actual: 54 value: 134 
actual: 115  value: 68 
actual: 20 value: 17 

感謝

+1

' 「RWB」' - >' 「R + B」' – Dmitri

+0

** [倒帶](http://www.cplusplus.com/reference/cstdio/rewind /)** – amdixon

+1

對於二進制讀/寫,你應該看看'fread'和'fwrite'。你可能會發現它們更適合這項任務。 –

回答

1

"rwb"不是有效fopen模式。你可能想使用

fopen("encodedFrog.bmp", "r+b"); 

,這將打開現有的文件以二進制方式輸入和輸出。如果該文件不存在,則應使用"w+b"

fopen("encodedFrog.bmp", "w+b"); 

這將打開一個新的文件,以二進制模式輸入和輸出。

此外,正如@amdixon提到的,不應該重新打開這些文件,而應該使用rewind,它將流位置重置爲開頭。

0

在修復了fopen問題後,您可能需要查看freadfwrite,它可以在二進制讀取/寫入時提供一些額外的錯誤檢查。

雖然沒有什麼錯讀/二進制在二進制一次寫一個字符,文件流的輸入/輸出你有附加功能freadfwrite,使您可以讀取和寫入字節的特定號碼(或任何其他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); 
} 

你可以使用freadfwrite,讓你驗證'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