在C中读取“纯”字节

时间:2012-03-05 18:32:39

标签: c binary byte

我想知道..你如何从二进制文件中一次读取一个字节?举个例子,我想从一些二进制文件中一次读取一个字节,然后将那些确切的字节写入某个输出文件(基本上是cp命令的一个非常基本的实现)。我当前的C代码如下所示:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char**argv)
{
    if (argc != 2) {
        fprintf(stderr, "Usage: %s <output file>\n", argv[0]);
        return 1;
    }

    FILE *outfile;
    outfile = fopen(argv[1], "w");

    unsigned char c;
    char temp;
    int tracker = 0;
    // Use temp because unsigned char will never be EOF
    while ((temp = getchar()) != EOF) {
        c = (unsigned char) temp;
        fprintf(outfile, "%c", c);
    }
fclose(outfile);
return 0;
}

我运行这样的程序:./main output.au < sample.au(.au是一个音频文件)

然而,我在output.au文件中得到的是一堆“^ @”一遍又一遍地重复。我可以正常播放sample.au音频文件,但不能播放output.au。我也(有点无意义地)对这两个文件做了diff,并且正如预期的那样,它们会有所不同。

帮助? 谢谢! -kstruct

更新 感谢大家的回复..我的代码现在看起来像:

outfile = fopen(argv[1], "wb");

int c;
while ((c = getchar()) != EOF) {
    fprintf(outfile, "%c", c);
}

3 个答案:

答案 0 :(得分:7)

getchar()会返回int。 您将int分配给char类型的变量,从而丢失信息。 不要这样做。

temp声明为int,然后去除演员。

答案 1 :(得分:1)

有几件事需要修复: 1)将STDIN重新打开为二进制。 freopen(NULL, "rb", stdin); 2)打开outfile:fopen(argv [1],“wb”); 3)temp需要是 int 类型。

答案 2 :(得分:0)

进行以下更正:

- outfile = fopen(argv[1], "w");
+ outfile = fopen(argv[1], "wb");


- c = (unsigned char) temp;
+ c = (unsigned char) (char) temp;