Что такое код fclose


Функция fclose

Функция fclose() закрывает файл, связанный с потоком stream , и дозаписывает его буфер. После обращения к функции fclose() элемент stream больше не связан с файлом, и все автоматически выделенные буфера освобождаются.

При успешном выполнении функция fclose() возвращает нуль; в противном случае возвращается значение EOF . Попытка закрыть уже закрытый файл расценивается как ошибка. В случае прекращения доступа к носителю данных до закрытия файла, как и при недостатке свободного пространства на диске, будет сгенерирована ошибка.

Пример

Следующая программа открывает и закрывает файл.

Закрыть файл с помощью fclose(), но файл все еще используется

У меня возникла проблема с удалением/переписыванием файла с помощью моей программы, которая также используется (читается) моей программой. Проблема заключается в том, что из-за того, что моя программа считывает данные из файла (output.txt), он помещает файл в состояние «в использовании», что делает невозможным удаление или перезапись файла.

Я не понимаю, почему файл остается «в использовании», потому что я закрываю файл после использования с fclose();

Я использую fclose(), чтобы закрыть файл, но файл остается в использовании моей программой, пока моя программа не будет полностью отключена.

Какое решение освобождает файл, чтобы его можно было удалить/перезаписать?

В действительности мой код не является циклом без конца; )

Обновление

Мне нравится просить часть моего кода, которая также генерирует файл ‘in use’. Это не цикл, и эта функция вызывается из main();

Вот фрагмент кода:

Цикл while анализирует файл. Файл output.txt содержит наборы из 9 переменных, количество наборов неизвестно, но всегда в наборах из 9.

output.txt может содержать, например: 0,1,2,3,4,5,6,7,8,8,7,6,5,4,1,2,3,0


обновление 2

извините за использование pre снова, но я не получаю форматирование этого сайта: (

fclose, fcloseall

int fcloseall(void)

Функция fclose() закрывает файл, связанный со stream, и очищает буфер. После вызова fclose() stream больше не связан с файлом и автоматически выделенная для буфера память освобождается.

В случае успеха функция fclose() возвращает 0; в противном случае возвращается ненулевое значение. Попытка закрытия уже закрытого файла является ошибкой.

Функция fcloseall() закрывает все открытые потоки, кроме stdin, stdout, stdaux, stdprn и stderr. Она не определена стандартом ANSI С.

Тестирование Выпуск fclose возвращаемого значения

Для того , чтобы иметь более чистый способ проверить конкретные функции, я хотел бы реализовать тесты на fclose функции. Но у меня была проблема при попытке записи и перечитывать растрового изображения.

На самом деле, у меня была ошибка произошедшей при тестировании fclose таким образом:

В то время как следующий код не дает какие-либо ошибки:

С большим количеством тестов, я видел это различие происходит только в режиме записи, но не в режиме чтения. Нормально ли такое различие происходит? Может кто-нибудь объяснить мне эту разницу?

EDIT: Я пытался получить ошибку смысла с этим кодом:

Но это также хорошо здесь и нет ошибок.

assert макрос , который заменяется не цит при компиляции с NDEBUG . Грубо говоря, если вы строите версию выпуска исполняемого файла, весь вызов fclose исключается из кода.


Это возможная причина, почему файлы не могут быть надлежащим образом закрыты.

assert() должен быть использован с скалярным выражением. Это означает, что вы не должны использовать функцию в нем.

Вы получаете это поведение , так как fclose(bmp_image) вычисляются дважды. Так он возвращается EOF на второй вызов, потому что файл уже закрыт.

Закрыть файл с помощью fclose(), но файл все еще используется

У меня возникла проблема с удалением/переписыванием файла с помощью моей программы, которая также используется (читается) моей программой. Проблема заключается в том, что из-за того, что моя программа считывает данные из файла (output.txt), он помещает файл в состояние «в использовании», что делает невозможным удаление или перезапись файла.

Я не понимаю, почему файл остается «в использовании», потому что я закрываю файл после использования с fclose();

Я использую fclose(), чтобы закрыть файл, но файл остается в использовании моей программой, пока моя программа не будет полностью отключена.

Какое решение освобождает файл, чтобы его можно было удалить/перезаписать?

В действительности мой код не является циклом без конца; )

Мне нравится просить часть моего кода, которая также генерирует файл ‘in use’. Это не цикл, и эта функция вызывается из main();

Вот фрагмент кода:

Цикл while анализирует файл. Файл output.txt содержит наборы из 9 переменных, количество наборов неизвестно, но всегда в наборах из 9.

output.txt может содержать, например: 0,1,2,3,4,5,6,7,8,8,7,6,5,4,1,2,3,0

извините за использование pre снова, но я не получаю форматирование этого сайта: (

Илон Маск рекомендует:  Что такое код waitsoundstate

Функция fclose

Лекция №8


9.1. РАБОТА С ФАЙЛАМИ В ЯЗЫКЕ С

Открытие и закрытие файла

Открытие файла для ввода-вывода через поток выполняет функция fopen().

FILE*fopen(const char*filename,const char*mode)

Возвращает указатель на переменную типа FILE, описывающий открытый поток файлового ввода-вывода. Если невозможно открыть файл, функция возвращает NULL-указатель. Переменная filename-указатель на ASCIIZ-строку символов, задающую спецификацию открытого файла. Если не специфицируется буква накопителя, используется накопитель по умолчанию. Если не задан абсолютный маршрут, в качестве начального директория используется текущая рабочая директория выбранного накопителя. Переменная mode-указатель на ASCIIZ-строку символов, задающую режим открытия файла. Образуется комбинацией символов, приведенных в табл.3.1.

Табл.1. Символы задания режима открытия потока ввода-вывода

Знак Функция
r Файл открывается только для чтения. Так может быть открыт лишь уже существующий файл. Если файл с заданной спецификацией не существует, fopen() возвращает NULL. При успешном открытии указатель записи-чтения файла устанавливается в 0.
w Файл открывается только для записи с усечением. Если файл не существует, он создается в заданном параметром filename директории. Созданный файл имеет атрибут архивного файла. Если создать файл не удается, функция возвращает NULL. Если файл существует, но имеет атрибут «только читаемый», возвращается NULL. При успешном открытии указатель записи-чтения файла устанавливается в 0. По этой причине возможно переопределение содержимого существующего файла, если перед доступом к файлу не выполняется принудительная установка указателя. Если все предыдущее содержимое должно быть сохранено, можно либо сразу после открытия выполнить перемотку указателя на конец файла (см. далее), либо открыть файл в режиме пополнения содержимого – режиме «а». Попытка чтения из файла завершается возвратом ошибки функцией чтения. После закрытия файл имеет всегда «новый» размер, соответствующий текущему положению указателя записи-чтения. Поэтому открытие существующего файла и его немедленное закрытие усекают файл до нулевой длины.
a Файл открывается для пополнения. Все то же самое, что и для режима «w», но после открытия файла указатель записи-чтения устанавливается на позицию конца файла. В результате запись в файл происходит с сохранением предыдущего содержимого.
r+ Файл открывается для обновления. Он доступен для чтения и записи, но после закрытия не происходит усечение файла: размер файла остается прежним, если текущий указатель записи-чтения файла состоит «левее» прежнего положения EOF. Сразу после открытия файла указатель устанавливается на начало файла.
w+ Файл открывается для обновления. Он доступен для чтения и записи, после закрытия существующий файл усекается. Если открываемый файл не существует, он создается в директории, задаваемом спецификацией файла. Сразу после открытия файла указатель записи-чтения файла устанавливается на начало файла. Файл открывается для обновления. Он доступен для чтения и записи, но после закрытия не происходит усечения файла. Сразу после открытия файла указатель записи-чтения устанавливается на позицию EOF.
a+ Файл открывается для обновления. Он доступен для чтения и записи, но после закрытия существующий файл не усекается. Сразу после открытия файла указатель записи-чтения устанавливается на позицию EOF.
b Файл открывается в двоичном режиме (см.3.1). Специализируется после r, w, a, r+, w+, a+, например «a+b». Для повышения мобильности программного кода предпочтительнее использовать управление двоичным или текстовым режимом через переменную _fmode, так как реализации Си для других ОС могут и не содержать параметров b или t при открытии файла.
t Файл открывается в текстовом режиме (см.3.1). Специализируется после r, w, a, r+, w+, a+, например “rt”.

Если данный файл открывается или создается в текстовом режиме, вы можете приписать символ t к значению параметра type (rt, w+t, и т.д.); аналогично, для спецификации бинарного режима вы можете к значению параметра type добавить символ b (wb, a+b, и т.д.).

Если в параметре type отсутствуют символы t или b, режим будет определяться глобальной переменной _fmode. Если переменная _fmode имеет значение O_BINARY, файлы будут открываться в бинарном режиме, иначе, если _fmode имеет значение O_TEXT, файлы открываются в текстовом режиме. Данные константы O_. определены в файле fcntl.h.

При открытии файла в режиме обновления (UPDATE), над результирующим потоком stream могут быть выполнены как операции ввода, так и вывода. Тем не менее вывод не может следовать непосредственно за вводом без вмешательства функций fseek или rewind. Также ввод, без применения функций fseek, rewind не может непосредственно следовать за выводом или вводом, который встречает конец файла (EOF).

fprintf(stderr, «Не могу открыть файл \n»);

Проблема закрытия файла fclose (язык С)

По заданию мне нужно считать базу данных из файла .txt в поля структуры. По отладчику смотрела, что все хорошо записывается(в сами структуры). Но при закрытии файла ловлю exception.

Это пример информации из файла для записи в поля структуры (последующие лежат в таком же виде, начиная со следующей строки) . На строке fclose(f) ломается. Может кто знает, в чем может быть проблема?

2 ответа 2


У вас куча ошибок и недочётов, и поэтому непонятно, откуда может возникнуть ошибка. Предлагаю просто следить за моей мыслью, и у вас всё будет хорошо для сдачи лабораторной. :) (и код понятнее сделаем, и рабочим всё сделаем). При компиляции использовались ключи -ansi , -pedantic , -Wall и -Werror ( могут и не использоваться : они всего лишь для самопроверки :D ).

Илон Маск рекомендует:  Что такое код fpt

Сами структуры

Посмотрите на DateOfBirth и Human . Раз вы делаете typedef , то нужно придумать имя для вашего псевдонима, а у вас оно вообще отсутствует (не понимаю, как ваш C-компилятор этого не заметил, если это вообще C-компилятор).

Исправляем, назначив то же имя, как и у самой структуры :

Когда вы работаете с такими структурами (да и ещё с файлами, которые с ней потенциально связаны), вам нужно (а по-моему, просто необходимо) использовать платформонезависимые типы (char-тип, к счастью, можно оставить). Список полей, в итоге, может быть следующим (заголовочный файл stdint.h ).

Для Human (аналогия с полей DateOfBirth ):

Если вы выделяете память для такой структуры в таком положении вещей, то вы, по факту выделяете больше, чем нужно (у вас такое есть в checkSize ). Посмотрим размер «старого» Human :

А если внимательно посчитаете, то по факту получите 212 :) Дело всё в выравнивании, но не будем заострять на этом внимание. Короче говоря, можете ‘обвернуть’ структуры (на всякий случай DateOfBirth тоже, а то мало ли, как машина ‘захочет’), ипользуя #pragma pack (push,1) и #pragma pack (pop) перед определением и после определения «алиаса» для структуры соответственно, то есть :

Этот пункт не является обязательным, поскольку pragma разнится в зависимости от её реализации, но является желательным, если есть такая возможность и нельзя по-другому исправить структуру.

В итоге, ваши определения могут быть следующими :

checkSize

У вас там мало того, что память выделенная не освобождается, так и слишком запутанный и непереиспользуемый код.

Предлагаю более подходящий вариант сигнатуры функции и её реализации (здесь уже «опустим» вопрос с кроссплатформенностью, ибо гораздо менее важно):

Реализация is_empty ( была позаимствована и немного переделана отсюда ):

is_empty нужен для того, чтобы вы не могли засчитать ‘пустую’ строку, как актуальную для записи её в структуру.


Протестируйте сами: оставьте где-нибудь ‘пустые’ строки, т.е. строки, содержащие только пробельный(-е) символ(-ы). В вашей реализации это бы засчиталось, и вы бы записали в какое-нибудь поле структуры ‘пустую’ строку.

В данном случае поля должны идти друг за другом, а иначе функция вернёт 0 ( единственный ‘минус’ тут в неудобочитаемости читаемого файла, потому что описания будут ‘слиты’, но реализация разделения — это просто и дело «десятое», и я не буду на этом останавливаться ).

readingFromFile

Я «убил» весь день на то, чтобы правильно вывести прочитанные данные в структуру. Немного длиннее, но выглядит это всё более логично, а от такой структурированности маловероятно получить ошибку :

Участвующие функции read_and_adjust_string и read_and_get_ul имеют следующие реализации :

loadToFile

Зачем вам в аргументах ‘указатель на указатель’? Этого не нужно : нам всего лишь надо прочитать значения и вывести их в файл.

printOnConsole (опционально)

Реализовал более понятный и приятный ‘вашему соседу’ код для отображения (по крайней мере, мне так удобнее):

Реализация print_human_info следующая :

Возможный ‘main’ для теста :

На будущее :

Чтобы лучше представлять информацию, нужно создать ещё один псевдоним :

Таким образом вам не придется постоянно ‘вытягивать’ и то, и то, а значит меньше аргументов на функции = лучшая удобочитаемость и чистота (но это уже вам задача, если желаете).

Задавайте вопрос более конкретно. Вы даже не сказали, в каком конкретно месте у вас возникают проблемы (у вас в коде не один fclose ). Старайтесь описывать задачу более коротко (пожалуйста).

Закрыть файл с помощью fclose(), но файл все еще используется


У меня возникла проблема с удалением/переписыванием файла с помощью моей программы, которая также используется (читается) моей программой. Проблема заключается в том, что из-за того, что моя программа считывает данные из файла (output.txt), он помещает файл в состояние «в использовании», что делает невозможным удаление или перезапись файла.

Я не понимаю, почему файл остается «в использовании», потому что я закрываю файл после использования с fclose();

Я использую fclose(), чтобы закрыть файл, но файл остается в использовании моей программой, пока моя программа не будет полностью отключена.

Какое решение освобождает файл, чтобы его можно было удалить/перезаписать?

В действительности мой код не является циклом без конца; )

Обновление

Мне нравится просить часть моего кода, которая также генерирует файл ‘in use’. Это не цикл, и эта функция вызывается из main();

Вот фрагмент кода:

Цикл while анализирует файл. Файл output.txt содержит наборы из 9 переменных, количество наборов неизвестно, но всегда в наборах из 9.

output.txt может содержать, например: 0,1,2,3,4,5,6,7,8,8,7,6,5,4,1,2,3,0

обновление 2

извините за использование pre снова, но я не получаю форматирование этого сайта: (

Разница между fclose и close

Если я fopen файл, в чем разница между вызовом fclose или close и каким мне следует пользоваться?

Если раздвоенные дети также имеют доступ к файлу, что они должны делать, когда закончат работу с файлом?

Илон Маск рекомендует:  Обзор Intel Pentium Haswell, отзывы пользователей


4 ответа

fclose() — это функция, связанная с файловыми потоками . Когда вы открываете файл с помощью fopen() и назначаете поток для FILE *ptr . Затем вы будете использовать fclose() чтобы закрыть открытый файл.

close() — это функция, связанная с дескрипторами файлов . Когда вы открываете файл с помощью open() и назначаете дескриптор для int fd . Затем вы будете использовать close() чтобы закрыть открытый файл.

Такие функции, как fopen() , fclose() т. Д. Являются стандартными функциями языка Си , тогда как другие категории open() , close() т. Д. Зависят от POSIX. Это означает, что код, написанный с использованием open() , close() т. Д., Не является стандартным кодом C и, следовательно, не является переносимым. Принимая во внимание, что код, написанный с помощью fopen() , fclose т. Д., Является стандартным кодом и может быть перенесен на любой тип системы.

Это зависит от того, как вы открыли файл. Если вы открываете файл с помощью fopen() , вы должны использовать fclose() а если вы открываете файл с помощью open() , вы должны использовать close() .

Если раздвоенные дети также имеют доступ к файлу, что они должны делать, когда закончат работу с файлом?

Это также зависит от того, где вы сделали вызов fork() : до открытия файла или после его открытия.

Функция fclose() в C добавляет символ EOF по умолчанию?

Я знаю, что в C++ символ EOF автоматически добавляется в конце файла с помощью таких утверждений, как filestream.close. Я хотел знать, это делается по-прежнему по C?

Создан 07 май. 16 2020-05-07 18:10:05 Rohan Saxena

В файлах нет символа EOF. Создайте файл с C++ ‘ofstream’, затем используйте hexdump, и вы ничего не увидите отдельно от того, что вы написали на него сами. ‘EOF’ — это просто константа, возвращаемая некоторыми функциями ввода/вывода C, чтобы указать, что в потоке нет ничего для чтения. – szczurcio 07 май. 16 2020-05-07 18:15:20

Нет ‘fclose’ не добавляет’ CTRL + Z’ (или EOF-символ времени DOS), но при открытии текстового потока ANSI или использовании ‘fopen’ с’ ‘t», текстовым определителем, MS по-прежнему проверяет наличие символа ‘CTRL + Z’, обрезать файл и удалить его, чтобы избежать неправильного поведения’ fseek’ и ‘ftell’. – Frankie_C 07 май. 16 2020-05-07 18:31:10

4 ответа

Он делает, но не как символ. (См. Комментарии по вашему вопросу) Но вы можете даже проверить это с помощью (feof(file)) . Это похоже на ГОСУДАРСТВО.

Создан 07 май. 16 2020-05-07 18:12:52 darksider


Хотя вы правы в отношении ‘feof’, как указано в комментариях, нет такой вещи, как« символ EOF ». Кроме того, вы можете также упомянуть, как правильно использовать функцию, потому что у многих людей есть проблемы с этим: https://stackoverflow.com/questions/5431941/why-is-while-feof-file-always-wrong – szczurcio 07 май. 16 2020-05-07 18:17:12

EOF не является символом. Это несимвольное значение int , возвращаемое некоторыми операциями, чтобы указать, что конец файла был достигнут. Таким образом, вопрос становится «Делает ли функция fclose() в C закрытием файла», что, конечно, имеет место.

Создан 07 май. 16 2020-05-07 18:16:24 Elazar

Нет EOF знак. EOF по определению «не соответствует допустимому коду символов». Часто это -1 . Он не записывается в файл в любой момент.

Есть историческое значение EOF значение знака (CTRL+Z) в DOS, но в наши дни оно устарело.

Чтобы ответить на ваш вопрос, fclose очень похож на filestream.close и закрывает файл.

Создан 07 май. 16 2020-05-07 18:18:07 Ani Menon

Ссылка очень хорошо, но зачем его копировать? – Elazar 07 май. 16 2020-05-07 18:22:09

Скопировал его, чтобы ответить и добавил ссылку, чтобы дать кредит. – Ani Menon 07 май. 16 2020-05-07 18:23:08

Если вопрос уже дан, вы должны проголосовать за его закрытие как «дубликат . ». – Elazar 07 май. 16 2020-05-07 18:24:57

@ Элазар любезно проверьте ссылку, а также вопрос там. Вопрос — это дубликат, если вопрос тот же, если ответы не совпадают. – Ani Menon 07 май. 16 2020-05-07 18:26:57

@ o11c ‘^ Z’ (Control + Z) используется для сигнализации конца файла и, таким образом, называется символом EOF в’ DOS’. [Читать] (https://en.wikipedia.org/wiki/Control-Z) – Ani Menon 07 май. 16 2020-05-07 18:44:07

Если были явным истекшим файла символ, который нуждался записи в файл, то да, fclose бы устроить, чтобы написать ее. Вам не пришлось бы писать это самостоятельно.

Например, когда-то текстовые файлы под MS-DOS имели явные контрольные символы конца строки на концах. В C под этой ОС я ожидал, что символ Control-Z будет написан, когда я позвоню fclose . (Но, с учетом сказанного, это уже давно используется MS-DOS, я не могу сказать, что я точно помню, как это происходит.)

Сегодня, как говорили другие ответы, ни одна из операционных систем, о которых мы заботимся требуют явных символов конца файла в файлах на диске, поэтому вопрос спорный.

Создан 07 май. 16 2020-05-07 18:54:26 Steve Summit

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL