Где размещена структура FILE? - PullRequest
1 голос
/ 11 января 2012

В C, при открытии файла с

FILE *fin; 
fin=fopen("file.bin","rb"); 

у меня есть только указатель на структуру FILE.Где фактическая структура FILE размещена на компьютере с Windows?И содержит ли он всю необходимую информацию для доступа к файлу?

Моя цель - выгрузить весь сегмент данных на диск и затем перезагрузить выгруженный файл обратно в начало сегмента данных.Код, который перезагружает выгруженный файл, помещается в отдельную функцию.Таким образом, указатель fin является локальным и находится в стеке, поэтому не перезаписывается при перезагрузке.Но сама структура FILE не является локальной.Я стараюсь не перезаписывать область памяти размером sizeof(FILE), которая начинается с адреса fin.

Операции

fread(DataSegStart,1,szTillFin,fin);
fread(dummy,1,sizeof(FILE),fin);
fread(DataSegAfterFin,1,szFinTillEnd,fin);

завершаются успешно, но я получаю ошибку подтверждения

fclose(fin)

Перезаписать ли я другие необходимые данные файла, кроме структуры FILE?

Ответы [ 4 ]

3 голосов
/ 11 января 2012

Фактический экземпляр структуры FILE существует в стандартной библиотеке. Обычно стандартная библиотека выделяет некоторое количество структур FILE, которые могут быть или не быть фиксированным числом из них. Когда вы вызываете fopen(), он возвращает указатель на одну из этих структур.

Данные в структуре FILE, вероятно, содержат указатели на другие вещи, такие как буферы. Вы вряд ли сможете сохранить и восстановить эти структуры на диск без какой-либо действительно глубокой интеграции со своей стандартной реализацией библиотеки.

Вас может заинтересовать что-то вроде CryoPID , которое выполняет процесс сохранения и восстановления на другом уровне.

2 голосов
/ 11 января 2012

Похоже, вы пытаетесь сделать что-то опасное, вряд ли сработает.

fopen выделяет структуру FILE и инициализирует ее. fclose выпускает его. Как оно распределяется и что в него вкладывается, зависит от реализации. Он может содержать указатель на другой фрагмент памяти, который также где-то выделен (поскольку он буферизован для ввода-вывода, я думаю, он где-то выделяет буфер).

Написание кода, основанного на внутренних элементах fopen, опасно, скорее всего, не будет работать и, безусловно, не будет стабильным и переносимым.

1 голос
/ 11 января 2012

Ну, у вас есть указатель на FILE объект, так что технически вы знаете, где он находится, но вы должны знать, что FILE намеренно является непрозрачным типом.Вам не нужно знать, что он содержит, вам просто нужно знать, что вы можете передать его функциям, которые знают об этом, для выполнения определенных действий.Кроме того, FILE может быть не полным типом, поэтому sizeof(FILE) может быть неправильным и, кроме того, объект может содержать указатели на другие структуры.Простого отказа от перезаписи объекта FILE вряд ли будет достаточно, чтобы избежать повреждения программы из-за перезаписи большей части ее памяти.

0 голосов
/ 11 января 2012

FILE определен в stdio.h. Он содержит всю информацию о файле, но, глядя на код, который вы показываете, я думаю, вы не понимаете его цели. Он создается и запускается через операционную систему с библиотекой C, которая заполняет FILE информацией о файле, но не содержится в самом файле.

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