Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
access()表示文件存在,但fopen()表示文件不存在_C_Git_Fopen - Fatal编程技术网

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

access()表示文件存在,但fopen()表示文件不存在,c,git,fopen,C,Git,Fopen,我有一个c程序正在试图读取一个文件。使用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_O

我有一个c程序正在试图读取一个文件。使用
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
命令克隆的问题

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

-rw-r--r-- 1 ben users   23 Jun 30 13:32 HEAD
有什么建议吗?

您不能这样做:

char *filename = strdup(git_dir);
strcat(filename, "/HEAD");
您正在将字符串“/HEAD”附加到文件名,但文件名只能容纳
git\u dir
的内容。因此,您正在写入超过缓冲区的内容,覆盖内存,并可能造成严重破坏,各种不可预知的行为都可能发生

改为这样做:

char *filename = malloc(strlen(git_dir) + 6); //length of /HEAD + null terminator
strcpy(filename, git_dir);
strcat(filename, "/HEAD");
请记住,stdout通常也是行缓冲的。这意味着如果您执行
printf(“YU无打开:”),您可能无法立即看到输出。打印换行符,\n以刷新输出。

您不能这样做:

char *filename = strdup(git_dir);
strcat(filename, "/HEAD");
您正在将字符串“/HEAD”附加到文件名,但文件名只能容纳
git\u dir
的内容。因此,您正在写入超过缓冲区的内容,覆盖内存,并可能造成严重破坏,各种不可预知的行为都可能发生

改为这样做:

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

请记住,stdout通常也是行缓冲的。这意味着如果您执行
printf(“YU无打开:”),您可能无法立即看到输出。打印换行符,\n以刷新输出。

printf(strerror(errno))打印什么?@AlexG.p:您可以使用
peror(“ERROR”)
代替。打印的错误的意思是“文件不存在”printf(strerror(errno))打印什么?@AlexG.p:您可以使用
peror(“ERROR”)
而不是。打印的错误是“文件不存在”
peror()
很方便用换行符写入
errno
值。这就是问题所在!奇怪的是,我只发现了几个旧代码不起作用的示例(它们都是我在将它们添加为子模块之前克隆的子模块)。谢谢你的回答
perror()
可以方便地用换行符写入
errno
值。这就是问题所在!奇怪的是,我只发现了几个旧代码不起作用的示例(它们都是我在将它们添加为子模块之前克隆的子模块)。谢谢你的回答!