Я хочу реализовать функцию, которая получает в качестве параметра FILE*
, которая уже открыта в режиме записи (a
, a+
, w
, w+
и т. д.), и считывает содержимое этого файла. Проблема здесь в том, что файл уже заблокирован (из-за fopen
) и мне нужно закрыть его перед началом чтения. Однако после того, как я прочитал файл, мне нужно снова открыть его, как это было до вызова моей функции.
Таким образом, мне нужны как имя файла, так и режим, с которым fopen
был вызван изначально.
Мне удалось получить имя файла. Однако режим кажется сложным. С этого момента я смог получить код режима, используя приведенный ниже код.
int fd = fileno(file_pointer);
int mode = fcntl(fd, F_GETFL);
К сожалению, между системами существует несоответствие (один и тот же открытый режим -> разные коды режимов). Является ли метод, показанный выше, реальным способом получить режим, в котором файл был открыт? У тебя есть другие идеи?
ftell
иfseek
для восстановления исходного состояния. - person Weather Vane   schedule 16.03.2019"w"
или"a"
, вы не сможете прочитать его с помощью этого файлового потока. Также обратите внимание, что в Unix-подобных системахfopen()
не блокирует файл — любой файл можно открыть много раз. Использованиеfcntl()
настолько хорошо, насколько это возможно. - person Jonathan Leffler   schedule 16.03.2019open(name, O_CREAT|O_DIRECTORY, mode)
? Это больше касается файловых дескрипторов, чем файловых потоков, но вы уже ищете в дескрипторах черезfileno()
. Помните, что Unix не различает двоичный и текстовый режимы. Вы работаете на платформе Windows? Правила там могут быть другими, и он различает бинарный и текстовый режимы. - person Jonathan Leffler   schedule 16.03.2019