1

我有一个正在尝试读取文件的 ac 程序。使用access()命令它说文件在那里但fopen()返回 NULL 并且 errno 说文件不存在。

截断的代码片段:

  FILE *fp;
  char *filename = strdup(git_dir);
  strcat(filename, "/HEAD");

  printf(git_dir);
  printf(":");
  printf(filename);
  printf(":");

  if (access(filename, F_OK)) {
    printf("Y U NO OPEN:");
  }

  fp = fopen(filename, "r");
  if (fp == NULL) {
    printf(strerror(errno));
    return;
  }

正如您从代码中可以看出的,这是试图打开 git 存储库的 .git/HEADS 文件。失败的特定存储库被克隆到另一个存储库的子目录中,然后作为子模块添加。我没有通过运行git submodule update命令克隆的问题。

上面的代码不会打印“YU NO OPEN:”,但会打印出strerror(). 我将文件名打印到屏幕上并打开文件,less它打开得很好。这个程序正在生成我的 zsh 提示符,所以我想它是由我的用户运行的,并且文件的权限是

-rw-r--r-- 1 ben users   23 Jun 30 13:32 HEAD

有什么建议么?

4

1 回答 1

6

你不能这样做:

char *filename = strdup(git_dir);
strcat(filename, "/HEAD");

您将字符串“/HEAD”附加到文件名,但文件名只有git_dir. 因此,您正在写入缓冲区,覆盖内存,并可能造成破坏,并且可能会发生各种不可预测的行为。

改为这样做:

char *filename = malloc(strlen(git_dir) + 6); //length of /HEAD + null terminator
strcpy(filename, git_dir);
strcat(filename, "/HEAD");

请记住,标准输出通常也是行缓冲的。这意味着如果您这样做printf("Y U NO OPEN:");,您可能不会立即看到输出。打印换行符 \n 以刷新输出。

于 2012-06-30T21:40:34.897 回答