C中的fgetc和fputc

时间:2015-10-17 03:46:15

标签: c fgetc

我试图从一个文件的开头复制5个字节并将它们放入另一个文件的开头。但是他们并没有准确地复制。我认为问题在于fputc和fgetc,但不确定是什么......

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

由于

2 个答案:

答案 0 :(得分:1)

export TACHYON_UNDERFS_ADDRESS=$TACHYON_HOME/underFSStorage 不是有效的"rwb"模式。你可能想用

fopen

将以二进制模式打开现有的输入和输出文件。如果该文件不存在,则应使用fopen("encodedFrog.bmp", "r+b");

"w+b"

这将以二进制模式打开输入和输出的新文件。

另外,正如@amdixon所提到的,您应该使用fopen("encodedFrog.bmp", "w+b"); 而不是重新打开文件,这会将流位置重置为开头。

答案 1 :(得分: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