我对C仍然相当新,但下面的程序编译得很好,(使用gcc)它甚至可以在使用文本文件时工作,但是当我使用其他文件格式时,即png
,我得到了没有。控制台吐出?PNG
而没有其他内容。我不希望图像作为图像打印,显然程序没有这样做,但我希望打印png文件中的数据。为什么程序不能正常运行?是因为fread拒绝除文本以外的任何文件吗?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
FILE *fp;
int main() {
char buffer[1000];
fp=fopen("FILE IN QUESTION HERE", "rb");
if(fp==NULL) {
perror("An error occured while opening the file...");
exit(1);
}
fread(buffer, 1000, 1, fp);
printf("%s\n", buffer);
fclose(fp);
return 0;
}
答案 0 :(得分:4)
%s
中的 printf()
用于打印以空字符结尾的字符串,而非二进制数据,而PNG标头包含一个签名,以防止数据被错误地转换为文本。
(实际上,PNG签名中没有0x00
,printf()
停在0x00
chunk大小所包含的IHDR
使用fwrite()
输出二进制数据,或通过putchar()
逐个打印字节。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void) {
FILE* fp; /* avoid using gloval variables unless it is necessary */
char buffer[1000] = {0}; /* initialize to avoid undefined behavior */
fp=fopen("FILE IN QUESTION HERE", "rb");
if(fp==NULL) {
perror("An error occured while opening the file...");
exit(1);
}
fread(buffer, 1000, 1, fp);
fwrite(buffer, 1000, 1, stdout); /* use fwrite instead of printf */
fclose(fp);
return 0;
}
答案 1 :(得分:0)
fread没有读取其他文件格式
代码不会检查fread()
的结果。 那是确定fread()
是否有效的方法。
char buffer[1000];
// fread(buffer, 1000, 1, fp);
size_t sz = fread(buffer, 1000, 1, fp);
if (sz == 0) puts("Did not read an entire block");
fread()
返回读取的块数。对于OP的情况,代码试图读取一个1000字节的块。建议阅读1000个块,每块1 char
而不是1块1000 char
。此外,避免使用幻数。
for (;;) {
size_t sz = fread(buffer, sizeof buffer[0], sizeof buffer, fp);
if (sz == 0) break;
// Somehow print the buffer.
print_it(buffer, sz);
}
对printf()
的OP调用需要指向字符串的指针。 C 字符串是一个字符数组,包括终止空字符。 buffer
可能/可能不包含null字符和空字符后的有用数据。
// Does not work for OP
// printf("%s\n", buffer);
.png文件的数据主要是二进制文件,几乎没有文字含义。下面是混合二进制数据和文本的示例打印功能。在学习.png文件格式之前,大多数输出似乎毫无意义。未经测试的代码。
int print_it(const unsigned char *x, size_t sz) {
char buf[5];
unsigned column = 0;
while (sz > 0) {
sz--;
if (isgraph(*x) && *x != `(`) {
sprintf(buf, "%c", *x);
} else {
sprintf(buf, "(%02X)", *x);
}
column += strlen(buf);
if (column > 80) {
column = 0;
fputc('\n', stdout);
}
fputs(buf, stdout);
}
if (column > 0) fputc('\n', stdout);
}