首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >access()表示文件存在,但fopen()表示文件不存在

access()表示文件存在,但fopen()表示文件不存在
EN

Stack Overflow用户
提问于 2012-07-01 05:36:16
回答 1查看 1.4K关注 0票数 1

我有一个c程序,它试图读入一个文件。使用access()命令,它会指出文件就在那里,但fopen()返回NULL,而errno则表示文件不存在。

截断的代码片段:

代码语言:javascript
复制
  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命令克隆的问题。

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

代码语言:javascript
复制
-rw-r--r-- 1 ben users   23 Jun 30 13:32 HEAD

有什么建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-01 05:40:35

你不能这样做:

代码语言:javascript
复制
char *filename = strdup(git_dir);
strcat(filename, "/HEAD");

您将字符串"/HEAD“附加到filename,但是filename只为git_dir的内容留出空间。因此,您正在写通过缓冲区,覆盖内存,并可能造成破坏,所有类型的不可预测的行为都可能发生。

改为执行以下操作:

代码语言:javascript
复制
char *filename = malloc(strlen(git_dir) + 6); //length of /HEAD + null terminator
strcpy(filename, git_dir);
strcat(filename, "/HEAD");

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11277865

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档