-1

我在下面编写了一个函数来将文件的内容读取到内存中。它在我的本地机器(Ubuntu 32 位)上运行良好,但在服务器(CentOS 64 位)上产生错误结果。

错误案例: 使用 40 字节文件,内容如下,在 64 位操作系统上,它给了我错误的结果。

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

编码:

char* file_get_contents(const char *filename) {
  FILE *stream = NULL;
  char *content = NULL;
  size_t ret;
  struct stat st;

  if ((stream = fopen(filename,"r")) == NULL) {
    fprintf(stderr, "Failed to open file %s\n", filename);
    exit(1002);
  }

  if(stat(filename, &st) < 0) {
    fprintf(stderr, "Failed to stat file %s\n", filename);
    exit(1002);
  }

  content = malloc(st.st_size);
  ret = fread(content, 1, st.st_size, stream);

  if (ret != st.st_size) {
    fprintf(stderr, "Failed to read file %s\n", filename);
    exit(1002);
  }

  fclose(stream);
  return content;
}
4

1 回答 1

3

file_get_contents的调用者无法正确使用您。它返回一个 char * 但不返回它的长度,也不返回一个字符串(即它不是以空值结尾的。)。

只要您正在阅读文本,请执行例如

  content = malloc(st.st_size + 1); // + 1 here for the nul terminator
  ret = fread(content, 1, st.st_size, stream);

  if (ret != st.st_size) {
    fprintf(stderr, "Failed to read file %s\n", filename);
    exit(1002);
  }
  content[st.st_size] = 0; //nul terminate
于 2012-08-16T09:36:40.043 回答