почему я получаю errno EINVAL (неверные параметры), но только когда файл пуст - PullRequest
1 голос
/ 14 мая 2009

Я использую <a href="http://msdn.microsoft.com/en-us/library/8f30b0db%28VS.71%29.aspx" rel="nofollow noreferrer">_fsopen</a>(path, "r+", _SH_DENYRW) для открытия файла в C, любой параметр защиты (_SH _...) вызывает ту же проблему.

При открытии пустого файла errno устанавливается равным 22 (EINVAL), а не так, если файл не пустой - тогда все в порядке. Что я могу сделать?

1 Ответ

2 голосов
/ 14 мая 2009

Документация подразумевает, что EINVAL будет результатом, если один из параметров будет недействительным. Поскольку "r+" должен быть допустимым указателем, и, если он вообще скомпилирован, _SH_DENYRW должен быть допустимым флагом, то остается только вопрос, является ли ваша переменная path не NULL, указывает на память, которая существует и читать и содержит действительное имя пути.

Я только что попробовал следующее:

#include <stdio.h>
#include <share.h>

int main(int argc, char **argv)
{
    FILE *f;

    if (argc != 2) {
        fprintf(stderr, "Usage: %s file\n", argv[0]);
        exit(1);
    }
    f = _fsopen(argv[1], "r+", _SH_DENYRW);
    if (f) {
        printf("Open ok.\n");
        fclose(f);
    } else {
        perror(argv[1]);
    }
    return 0;
}

На файлах, которые существуют и могут быть записаны, независимо от их размера, он печатает «Open ok.», Что означает, что _fsopen() успешно. Пара других дел:

Файл только для чтения:

C:>fsopen ro.txt
ro.txt: Permission denied

Нет файла:

C:>fsopen nosuchfile
nosuchfile: No such file or directory

Файл устройства:

C:>fsopen NUL:
Open ok.

Файл нулевой длины:

C:>fsopen zero.txt
Open ok.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...