access始终返回-1,即使文件存在

access始终返回-1,即使文件存在,c,file-io,C,File Io,我在为学校工作的实验室有点问题。 它应该做的是检查文件是否存在。当我尝试检查文件是否存在时,除了一行代码外,我的代码工作正常。即使文件存在,它也会返回,就好像它不总是在那里一样。但是,如果我将文件名硬编码到程序中,它就可以正常工作。我只是想弄清楚,当我将文件名传递到accept(或fopen)时,是什么原因导致文件名被错误地解释(我尝试了两者) #包括 #包括 #包括 int main(){ //打开lab4.in FILE*FILE=fopen(“lab4.in”,“r”); 如果(文件==0

我在为学校工作的实验室有点问题。 它应该做的是检查文件是否存在。当我尝试检查文件是否存在时,除了一行代码外,我的代码工作正常。即使文件存在,它也会返回,就好像它不总是在那里一样。但是,如果我将文件名硬编码到程序中,它就可以正常工作。我只是想弄清楚,当我将文件名传递到accept(或fopen)时,是什么原因导致文件名被错误地解释(我尝试了两者)

#包括
#包括
#包括
int main(){
//打开lab4.in
FILE*FILE=fopen(“lab4.in”,“r”);
如果(文件==0){
printf(“无法打开lab4.in进行读取”);
出口(-1);
}
//获取要检查的文件名
char filetocheck[120],输出[12];
fgets(filetocheck,120,file);
int i;
//打开lab4.out进行写入
取消链接(“lab4.out”);
文件*write=fopen(“lab4.out”,“w”);
fgets(输出,12,文件);
//检查文件是否存在,并将字符写入lab4.out
if(访问(filetocheck,F_OK)=-1){

对于(i=5;i好的,当这样的i/O操作失败时,以及-1,您将得到一个全局
int errno;

如果您有printf,请将其替换为

  perror(argv[0]); /* or something else useful. See below */
并加入声明

  int errno;
#include
s和
int main
之间,您将得到一条有用的错误消息

(注:需要检查两件事:确保文件在您期望的位置,并使用
ls-l
确保其可读性。)

更新


该死,这就是我没有检查手册页的原因。
perror
的参数实际上是一个字符串,用于在错误消息之前。

好的,当这样的I/O操作失败时,以及-1,你会得到一个全局
int errno;

如果您有printf,请将其替换为

  perror(argv[0]); /* or something else useful. See below */
并加入声明

  int errno;
#include
s和
int main
之间,您将得到一条有用的错误消息

(注:需要检查两件事:确保文件在您期望的位置,并使用
ls-l
确保其可读性。)

更新

该死,这就是我没有检查手册页的原因。
perror
的参数实际上是一个字符串,用于在错误消息之前。

在此语句中:

fgets(filetocheck, 120, file);
作为filetocheck缓冲区的一部分,您可能会收到不需要的回车符。

在此语句中:

fgets(filetocheck, 120, file);

你可能会收到一个不需要的回车符作为你的filetocheck缓冲区的一部分。

-1.我需要更多的信息。我已经阅读了你的问题,但我不知道程序运行时会发生什么。你必须向我们提供程序运行时会发生什么的全部细节。你必须努力确定哪些代码行成功y已处理。例如,您应该打印
filetocheck
的内容,以确保其正确无误。
printf(“\n”,filetocheck)
奇怪的是,我们中的一些人还是找到了有用的答案。-1.我需要更多的信息。我读了你的问题,但我不知道程序运行时会发生什么。你必须向我们提供程序运行时会发生什么的全部细节。你必须努力确定哪些代码行被成功处理。例如,你应该打印
filetocheck
的内容,这样您就可以确保它是正确的。
printf(“\n”,filetocheck);
奇怪的是,我们两个人还是管理了有用的答案。在现代系统中,
int errno
声明实际上不起作用(因为errno是线程本地的).include
#include
是规范的。否则答案很好。您不需要将
errno
传递给
perror()
-函数采用指向字符串的
char*
,而不是
int
。正确调用的示例是
perror(“访问”)
-甚至不需要声明
错误,你只需要声明
peror()
(来自
stdio.h
)。啊,废话。伤害你的不是你不知道的,而是你认为你知道的。在现代系统中,
int errno
声明实际上不起作用(因为errno是线程本地的)。
#include
是规范的。否则答案很好。您不会将
errno
传递给
perror()
-函数采用指向字符串的
char*
,而不是
int
。正确调用的示例是
perror(“访问”);
-甚至不需要声明
errno
,只需要声明
peror()
(来自
stdio.h
).啊,废话。伤害你的不是你不知道的,而是你认为你知道的,不是这样的。谢谢,我在发布这篇文章后就发现了。不知道它是在拾取\n。写了一点来消除它,现在它工作正常。谢谢,我在发布这篇文章后就发现了。不知道它拾取了\n.W死记硬背一点,使其无效,现在工作正常。