access всегда возвращает -1, даже если файл существует - PullRequest
1 голос
/ 01 июня 2011

У меня небольшая проблема с лабораторией, над которой я работаю в школе. Он должен проверить, существует ли файл или нет. Мой код работает нормально, за исключением одной строки, когда я пытаюсь проверить, существует ли файл или нет. Даже если файл существует, он возвращается так, как будто его нет всегда. Тем не менее, если я жестко закодирую имя файла в программе, он будет работать нормально. Я просто пытаюсь выяснить, что является причиной неверного толкования имени файла, когда я передаю его в команду accept (или fopen, я пробовал оба).

#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 ]

5 голосов
/ 01 июня 2011

Хорошо, когда такая операция ввода-вывода завершается с ошибкой, равно как и -1, вы получаете глобальный результат int errno;

Там, где у вас есть printf, замените его на

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

и добавьте объявление

  int errno;

между вашими #include s и int main, и вы получите полезное сообщение об ошибке.

(PS:Проверьте две вещи: убедитесь, что файл находится там, где вы ожидаете, и используйте ls -l, чтобы убедиться, что он читабелен.)

Обновление

Черт, вот что яполучить за то, что не проверял справочную страницу.Аргумент perror действительно является строкой, используемой для предисловия к сообщению об ошибке.

4 голосов
/ 01 июня 2011

В этом утверждении:

fgets(filetocheck, 120, file);

возможно, вы получаете нежелательный возврат каретки как часть буфера проверки файлов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...