Как поймать режим файла? - PullRequest
0 голосов
/ 29 января 2019

Мне нужно поймать режимы ниже:

"rb", "r+b" и "wb".

Я пытался выполнить код (скомпилированный) этого:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main()
{
    FILE *file = fopen("data.bin", "r");
    if (!file){
        perror("");
        return -1;
    }

    int fd = fileno(file);
    if (fcntl(fd, F_GETFL) == O_RDONLY){
        printf("read only\n");
    }

    // printf("%d\n", O_APPEND);

    fclose(file);
    return 0;
}

Но ничего не напечатано.fcntl () возвращает целые числа, такие как 32768, но мне нужны макросы из библиотеки, такие как O_RDONLY.

1 Ответ

0 голосов
/ 29 января 2019

Как правило, вы не можете поймать -given FILE* handle-, файловый режим, в смысле fopen, с помощью переносимой программы на языке C.

Например, ваш FILE* может бытьполучены с popen, fmemopen, open_memstream, fdopen и т. д. и могут быть доступны только для чтения или только для чтения.Возможно, он даже не имеет действительного дескриптора файла, заданного fileno.

. Вам следует принять и определить и соглашения о документе о них.

Например, в Linux сокет может быть доступен для чтения и записи на уровне операционной системы, и вы можете иметь два разных дескриптора FILE* (используя fdopen) для чтения и для записи.,

И, конечно же, дескриптор FILE* не может использоваться после fclose (или pclose)

Так что гипотетическая процедура fprint_stuff(FILE*, struct stuff_st*) должна документировать, что первый аргумент доступный для записи дескриптор файла, и он просто вызовет fwrite и fprintf, но должен проверить, что они не потерпели неудачу.

...