C++ 功能“;fread();不读取特定的文件类型?

C++ 功能“;fread();不读取特定的文件类型?,c++,fread,C++,Fread,我用这段代码将一些文件加载到内存中,加载到数据中 我想读的同一路径中有三个文件:一个XML、一个PNG和一个TTF字体文件。所有三个都已成功打开,其大小显示在size中。不幸的是,只有XML和PNG被读入数据中 char* data; size_t size = 0; FILE *fp = fopen(completeFilePath, "rb"); if (fp != NULL) { fseek(fp, 0, SEEK_END); size = ftell(fp

我用这段代码将一些文件加载到内存中,加载到数据中

我想读的同一路径中有三个文件:一个XML、一个PNG和一个TTF字体文件。所有三个都已成功打开,其大小显示在size中。不幸的是,只有XMLPNG被读入数据中

  char* data;
  size_t size = 0;
  FILE *fp = fopen(completeFilePath, "rb");
  if (fp != NULL) {
    fseek(fp, 0, SEEK_END);
    size = ftell(fp);
    fseek(fp, 0, SEEK_SET);
    data = new char[size];
    size_t result = fread(data, sizeof(char), size, fp);
    fclose(fp);
  }
TTF文件获得正确的大小,与fread结果同样正确,但数据为空(非空)且基础为空fp->\U

  char* data;
  size_t size = 0;
  FILE *fp = fopen(completeFilePath, "rb");
  if (fp != NULL) {
    fseek(fp, 0, SEEK_END);
    size = ftell(fp);
    fseek(fp, 0, SEEK_SET);
    data = new char[size];
    size_t result = fread(data, sizeof(char), size, fp);
    fclose(fp);
  }
你能解释一下这个问题吗


非常感谢。

空字节并不神奇地意味着它所在的任何内容的结束。这只是许多C标准库函数使用的约定。一个文件包含一个空字节,然后后面有更多字符是完全有效的。这正是
数据中的内容:一个空字节,然后是更多字符。所以它实际上不是空的;您只是错误地假设它是空的。

您如何看待
数据是否为空?我猜它实际上不是空的,而是包含一个空字节,您使用函数来查看它,将空视为字符串终止符。您查看过
数据的内容吗?您如何看待
数据的内容
?它应该包含什么?而
文件
是一个不透明的结构,您不应该查看其成员(如果已知)。我在调试时查看
数据的内容。我可以读入完整的XML文件的内容,看到PNG文件的二进制数据,只看到带有TFF的
\0
字节。这证实了我在第一条评论中怀疑的错误。我建议使用
uint8\t
作为字节,而不是
char
char
类型表示变量包含字符。字节可能包含非字符的值(尤其是不可打印的字符)。大多数调试器都有“原始内存”视图,通常显示为十六进制ascii转储。试试看。