Функция C remove () не удаляет целевой файл в среде Windows. - PullRequest
0 голосов
/ 30 ноября 2018

Я пишу программу, которая запрашивает у пользователя имя файла и создает его, если он не существует.В конце программы я хочу проверить, пуста ли созданная программа, и, если она есть, удалить ее.Не удаляя его, а затем запуская программу с тем же именем файла, портит способ обнаружения ввода.

Я пытался использовать rewind(), чтобы вернуться в начало, а затем проверять feof(), чтобы увидетьесли в начале файла был символ EOF, но это не сработало.

Затем я провел поиск в Интернете и нашел метод, который использовал fseek() для перехода в конец файла,а затем с помощью ftell() проверил, был ли конец файла в позиции 0, но опять-таки это не сработало.

Я вернулся и стал больше ковыряться, и обнаружил, что проблема может быть в том, что я не имелСначала я не использовал fclose(), поэтому я снова попробовал два предыдущих решения, на этот раз обязательно закрыв файл перед попыткой его удаления.Все еще без игры в кости.

Я попытался проверить, на что было установлено значение errno, и получил 2: No such file or directory.Это явно неверно, так как если бы это было так, это означало бы, что я достиг своей цели, и когда я проверяю рабочий каталог, файл все еще там.

Я абсолютно не знаю, что попробоватьследующий.Кто-нибудь может указать мне правильное направление?

Вот способы, которыми я пытался удалить файл (fp - это указатель файла, а file - это указатель на символ с именем файлаfp указывает на.):

Попытка 1:

rewind(fp);
if(feof(fp)){
    remove(file);
}

Попытка 2:

fseek(fp, 1, SEEK_END);
long size = ftell(fp);
if(size == 0){
    remove(file);
}

Попытка 3:

fseek(fp, 1, SEEK_END);
long size = ftell(fp);
fclose(fp);
if(size == 0){
    remove(file);
}

Попытка 4:

rewind(fp);
int empty = 0;
if(feof(fp)){
    empty = 1;
}
fclose(fp);
if(empty == 1){
    remove(file);
}

ОБНОВЛЕНИЕ: Вот пара MCVE, по одному для каждого метода.

#include <stdio.h>
#include <errno.h>

int main() {
    FILE *fp;
    char file[40];
    scanf(" %[^\n]s", file);
    fp = fopen(file, "r");
    if(fp == NULL){
        fp = fopen(file, "w");
    int result;
    rewind(fp);
    int empty = 0;
    if(feof(fp)){
        empty = 1;
    }
    fclose(fp);
    if(empty == 1){
        result = remove(file);
    }
    printf("%d\n", result);
    printf("%d\n", errno);
    return 0;
}

Версия 2:

#include <stdio.h>
#include <errno.h>

int main() {
    FILE *fp;
    char file[40];
    scanf(" %[^\n]s", file);
    fp = fopen(file, "r");
    if(fp == NULL){
        fp = fopen(file, "w");
    int result;
    fseek(fp, 1, SEEK_END);
    long size = ftell(fp);
    fclose(fp);
    if(size == 0){
        result = remove(file);
    }
    printf("%d\n", result);
    printf("%d\n", errno);
    return 0;
}

ОБНОВЛЕНИЕ 2:

Я только что понял, что когда я делал MCVE, когда я их запускал, result возвращал 0, что должно означать, что он был успешным, но файл все еще былтам в каталоге.Я в недоумении для слов.

1 Ответ

0 голосов
/ 30 ноября 2018

Код не достигает оператора remove.

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