这是我的代码,用于检查文件是否存在:
#include<stdio.h>
#include<zlib.h>
#include<unistd.h>
#include<string.h>
int main(int argc, char *argv[])
{
char *path=NULL;
FILE *file = NULL;
char *fileSeparator = "/";
size_t size=100;
int index ;
printf("\nArgument count is = %d", argc);
if (argc <= 1)
{
printf("\nUsage: ./output filename1 filename2 ...");
printf("\n The program will display human readable information about the PNG file provided");
}
else if (argc > 1)
{
for (index = 1; index < argc;index++)
{
path = getcwd(path, size);
strcat(path, fileSeparator);
printf("\n File name entered is = %s", argv[index]);
strcat(path,argv[index]);
printf("\n The complete path of the file name is = %s", path);
if (access(path, F_OK) != -1)
{
printf("File does exist");
}
else
{
printf("File does not exist");
}
path=NULL;
}
}
return 0;
}
运行命令./output test.txt test2.txt 输出是:
$ ./output test.txt test2.txt
Argument count is = 3
File name entered is = test.txt
The complete path of the file name is = /home/welcomeuser/test.txt
File does not exist
File name entered is = test2.txt
The complete path of the file name is = /home/welcomeuser/test2.txt
File does not exist
现在系统中确实存在test.txt:
$ ls
assignment.c output.exe output.exe.stackdump test.txt
然而test.txt显示为不存在的文件。
请帮我理解这里的问题。此外,请随时发布任何建议,以改善代码/避免错误。
此致 darkie
答案 0 :(得分:2)
仅仅因为对access()
的调用失败并不意味着该文件不存在。由于其他原因,呼叫可能会失败。
使用printf("error:%s\n", strerror(errno));
打印出错误消息的文本。
此外,您仍然错误地追加了getcwd收到的“路径”,就像您在上一个问题中那样。即使它没有崩溃,它仍然是不正确的,可能会导致你的问题......甚至可能是你现在遇到的问题。
getcwd()为您的路径分配缓冲区,但该缓冲区的大小仅适合路径。你追加到那个缓冲区,走到了尽头。那很糟糕,你做不到。它会引起问题,偶尔也会崩溃。你需要暂停并理解这个getcwd函数如何工作以及如何正确使用它。
答案 1 :(得分:0)
我强烈建议通过malloc()和fpathconf()(提示,PATH_MAX)分配足够的空间来存储路径。
分配和组装它的非标准方式是asprintf()。
请确保在不再需要时释放生成的路径,并检查因用户输入错误而可能失败的每个呼叫。
如果使用malloc(),请始终检查失败(结果为NULL)。
祝你好运:)