fread没有读取其他文件格式

时间:2016-03-08 01:47:58

标签: c fread

我对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;
}

2 个答案:

答案 0 :(得分:4)

%s中的

printf()用于打印以空字符结尾的字符串,而非二进制数据,而PNG标头包含一个签名,以防止数据被错误地转换为文本。

(实际上,PNG签名中没有0x00printf()停在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);
}