我有一个尝试读取文件的程序。使用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
有什么建议吗?
答案 0 :(得分: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");
请记住,stdout通常也是行缓冲的。这意味着如果执行printf("Y U NO OPEN:");
,您可能无法立即看到输出。打印换行符\ n,以刷新输出。