-1

ファイルの内容をメモリに読み込む関数を以下に記述しました。私のローカル マシン (Ubuntu 32 ビット) では問題なく動作しますが、サーバー (CentOS 64 ビット) では間違った結果が生成されます。

間違っ たケース: 40 バイトのファイルの場合、コンテンツは以下のとおりです。64 ビット OS では、間違った結果が得られました。

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 * を返しますが、その長さは返しません。文字列も返しません (つまり、null で終了しません)。

テキストを読んでいる限り、例えば

  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 に答える