Как получить режим открытия файла в C (LINUX)

Я хочу реализовать функцию, которая получает в качестве параметра FILE*, которая уже открыта в режиме записи (a, a+, w, w+ и т. д.), и считывает содержимое этого файла. Проблема здесь в том, что файл уже заблокирован (из-за fopen) и мне нужно закрыть его перед началом чтения. Однако после того, как я прочитал файл, мне нужно снова открыть его, как это было до вызова моей функции.

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

Мне удалось получить имя файла. Однако режим кажется сложным. С этого момента я смог получить код режима, используя приведенный ниже код.

int fd = fileno(file_pointer);
int mode = fcntl(fd, F_GETFL);

К сожалению, между системами существует несоответствие (один и тот же открытый режим -> разные коды режимов). Является ли метод, показанный выше, реальным способом получить режим, в котором файл был открыт? У тебя есть другие идеи?


person konstantinosAR    schedule 16.03.2019    source источник
comment
Было бы проще не изменять аргумент FILE* и открыть файл во второй раз в режиме чтения.   -  person user803422    schedule 16.03.2019
comment
Почему бы просто не сбросить файл, а потом открыть его отдельно для чтения? Зачем нужно закрывать?   -  person hyde    schedule 16.03.2019
comment
Почему бы не открыть файл в режиме чтения/записи? Затем вы можете использовать ftell и fseek для восстановления исходного состояния.   -  person Weather Vane    schedule 16.03.2019
comment
Обратите внимание, что если файловый поток открыт в обычном режиме "w" или "a", вы не сможете прочитать его с помощью этого файлового потока. Также обратите внимание, что в Unix-подобных системах fopen() не блокирует файл — любой файл можно открыть много раз. Использование fcntl() настолько хорошо, насколько это возможно.   -  person Jonathan Leffler    schedule 16.03.2019
comment
Вы можете найти полезную информацию на странице Каково ожидаемое поведение open(name, O_CREAT|O_DIRECTORY, mode)? Это больше касается файловых дескрипторов, чем файловых потоков, но вы уже ищете в дескрипторах через fileno(). Помните, что Unix не различает двоичный и текстовый режимы. Вы работаете на платформе Windows? Правила там могут быть другими, и он различает бинарный и текстовый режимы.   -  person Jonathan Leffler    schedule 16.03.2019
comment
Ты прав! Проблема в том, что строка сохраняется в файле не сразу при вызове fwrite, а при закрытии файла.   -  person konstantinosAR    schedule 16.03.2019