zspacekcc
zspacekcc

Reputation: 21

access always returns -1, even when the file exists

I'm having a bit of a problem with a lab I'm working on for school. What it's supposed to do is check to see if a file exists or not. My code works fine except one line, when I try to check to see if the file exists or not. Even if the file exists, it's returning as if it's not there always. Yet if I hard code the file name into the program it works fine. I'm just trying to figure out what's causing the file name to be interpreted wrong when I pass it into accept (or fopen I've tried both).

#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);

}

Upvotes: 1

Views: 135

Answers (2)

Charlie Martin
Charlie Martin

Reputation: 112356

Okay, when an I/O operation like this fails, as well as the -1, you get a result in a global int errno;

Where you have your printf, replace that with

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

and add the declaration

  int errno;

between your #includes and the int main, and you'll get a useful error message.

(PS: Two things to check: make sure the file's where you expect it, and use ls -l to make sure it's readable.)

Update

Dammit, that's what I get for not checking the man page. The argument to perror is indeed a string, used to preface the error message.

Upvotes: 5

Jim Lewis
Jim Lewis

Reputation: 45025

In this statement:

fgets(filetocheck, 120, file);

you may be getting an unwanted carriage return as part of your filetocheck buffer.

Upvotes: 4

Related Questions