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

时间:2011-05-31 23:51:07

标签: c file-io

我正在为一所正在上学的实验室遇到一些问题。 它应该做的是检查文件是否存在。当我尝试检查文件是否存在时,我的代码工作正常,除了一行。即使文件存在,它也会返回,就好像它不存在一样。然而,如果我将文件名硬编码到程序中,它可以正常工作。我只是试图弄清楚当我将文件名传递给accept时导致文件名被解释错误的原因(或者我已经尝试了两种文件)。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main() {
//open lab4.in
FILE *file = fopen("lab4.in", "r");
if (file == 0) {
    printf("Unable to open lab4.in for reading");
    exit(-1);
}

//get the file name to check
char filetocheck[120], output[12];
fgets(filetocheck, 120, file);
int i;

//open lab4.out for writing
unlink("lab4.out");
FILE *write = fopen("lab4.out", "w");


fgets(output, 12, file);

//check the file is there and write the characters to lab4.out 
if (access(filetocheck, F_OK) == -1){
    for (i=5; i<10; i++){
        fputc(output[i], write);
    }
} else {
    for (i=0; i<5; i++){
        fputc(output[i], write);
    }
}

//close the files at the end
fclose(write);
fclose(file);

}

2 个答案:

答案 0 :(得分:5)

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

的结果

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

  perror(argv[0]); /* or something else useful. See below */

并添加声明

  int errno;

#includeint main之间,您将收到有用的错误消息。

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

<强>更新

该死,这是我没有检查手册页的结果。 perror的参数确实是一个字符串,用于作为错误消息的前言。

答案 1 :(得分:4)

在此声明中:

fgets(filetocheck, 120, file);

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