我想知道..你如何从二进制文件中一次读取一个字节?举个例子,我想从一些二进制文件中一次读取一个字节,然后将那些确切的字节写入某个输出文件(基本上是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);
}
答案 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;