моя контактная информация
Почтамезофия@protonmail.com
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
🌟🌟Домашняя страница автора:эфемеры__
🌟🌟Принадлежащий столбец:язык Си
3. Текстовые файлы и двоичные файлы.
4. Функции, управляющие открытием и закрытием файлов.
2. Последовательное чтение и запись файлов.
3. Случайное чтение и запись файлов.
4. Определение окончания чтения файла
Когда мы пишем программы, мы часто храним данные в переменных. Если программа завершится и память будет освобождена, эти данные будут потеряны. Итак, есть ли у нас способ постоянно сохранять эти данные, чтобы они все еще существовали при повторном открытии программы? Ответ: да. Что можно сделать:Операции с файлами。
Данные программы необходимо выводить на внешние устройства, а также их необходимо вводить с внешних устройств. Для разных устройств методы ввода и вывода различны. Чтобы облегчить наши операции с различными устройствами ввода и вывода, у нас есть весьма абстрактное понятие «поток». В языке C операции ввода и вывода с файлами, экранами, клавиатурами и т. д. выполняются посредством «потоков». В общем, если мы хотим записать или прочитать данные, нам нужно открыть поток.
Когда запускается программа на языке C, по умолчанию онатри ручьяДля нас уже открыты:
стандартный ввод--Стандартный поток ввода, в большинстве случаев ввод с клавиатуры.
стандартный вывод--Стандартный поток вывода, в большинстве случаев вывод на монитор.
stderr--Стандартный поток ошибок, в большинстве случаев выводимый на монитор.
Поскольку эти три потока открыты по умолчанию, мы можем напрямую выполнять операции ввода и вывода, используя такие функции, как scanf и printf.
Эти три потока также имеют типы. Их типы:Указатель файла (FILE*) .Когда мы выполняем файловые операции, мы передаемПеременная указателя файла может косвенно найти связанный с ней файл.。
В зависимости от того, как организованы данные, файлы данных называютсятекстовый файлилибинарный файл . Данные хранятся в двоичной форме в памяти,Если он выводится во внешний файл хранения без преобразования, этобинарный файл。
Если его необходимо сохранить в коде ASCII во внешнем хранилище, его необходимо преобразовать перед сохранением.Файл, хранящийся в виде символов ASCII,текстовый файл。
Как часть данных хранится в файле?
Символы всегда сохраняются в форме ASCII, а числовые данные могут храниться как в ASCII, так и в двоичной форме. Например, если имеется целое число 10000, то если оно выводится на диск в виде ASCII-кода, оно займет на диске 5 байт (по одному байту на каждый символ), а если выводится в двоичном виде, то оно будет занимать на диске всего 4 байта.
Разобравшись с этими необходимыми знаниями, давайте перейдем к сути — открытию и закрытию файлов. Язык C предоставляет две функции, которые отвечают за открытие и закрытие файлов соответственно. Прототипы следующие:
открыть файл:ФАЙЛ * fopen ( const char * имя файла, const char * режим );
Закройте файл:инт fclose ( ФАЙЛ * поток );
Функция fopen имеет два параметра:Первый параметр выражается в виде строкиимя файла, второй параметр — это файлОткрытый метод, представленный строкой .При использовании этой функции нам необходимо создатьпеременная указателя файла Чтобы получить, когда файл не открывается, он возвращает нулевой указатель. Что касается способов открытия, то здесь можно выделить следующие:
Открытый метод | значение | Если указанный файл не существует |
«р» (только чтение) |
Для ввода данных откройте существующий текстовый файл
| Возвращает нулевой указатель |
"w" (только запись) |
Для вывода данных откройте текстовый файл
| Создать новый файл |
«а» (добавить) | Добавить данные в конец текстового файла | Создать новый файл |
«рб» (только чтение) | Для ввода данных откройте бинарный файл | Возвращает нулевой указатель |
"wb" (только запись) | Для вывода данных откройте двоичный файл | Создать новый файл |
«аб» (добавить) | Добавить данные в конец двоичного файла | Создать новый файл |
«r+» (читать и писать) | Для чтения и записи откройте текстовый файл | Возвращает нулевой указатель |
«w+» (читать и писать) | Для чтения и записи создайте новый текстовый файл. | Создать новый файл |
«а+» (читать и писать) | Откройте файл, прочитайте и напишите в конце файла. | Создать новый файл |
«rb+» (чтение и запись) | Откройте двоичный файл для чтения и записи. | Возвращает нулевой указатель |
«wb+» (чтение и запись)
| Для чтения и записи создайте новый двоичный файл. | Создать новый файл |
«ab+» (читать и писать)
| Откройте двоичный файл, прочитайте и напишите в конце файла. | Создать новый файл |
Для функции fclose ее параметром является указатель файла, который используется для закрытия файла, на который указывает указатель файла.
Далее пытаемся открыть и закрыть файл:
- #include <stdio.h>
-
- int main()
- {
- FILE* pf = fopen("test.txt", "w");
- if (pf == NULL)//文件打开失败则退出程序
- {
- perror("fopen");
- return 0;
- }
- printf("文件打开成功n");
- fclose(pf);
- pf = NULL;//避免出现野指针,及时制空
- return 0;
- }
Видно, что, поскольку метод открытия — «w», в пути действительно появляется файл с именем «test.txt».
Далее мы введем несколько функций дляЧтение или запись данных в файл。
Имя функции | Функция | Применимый к |
fgetc | Функция ввода символов | Все входные потоки |
fputc | функция вывода символов | Все выходные потоки |
fgets | Функция ввода текстовой строки | Все входные потоки |
fputs | Функция вывода текстовой строки | Все выходные потоки |
fscanf | Функция ввода формата | Все входные потоки |
fprintf | Функция вывода формата | Все выходные потоки |
ужас | Двоичный вход | Входной поток файла |
fwrite | Двоичный выход | Выходной поток файла |
Далее мы пытаемся использоватьfscanfиfprintfфункция:
Первым параметром этих двух функций является указатель файла, который используется для чтения и записи данных файла. Последующие параметры такие же, как у функций scanf и printf.
- #include <stdio.h>
-
- int main()
- {
- FILE* pf = fopen("test.txt", "w");//要写入数据,以写的形式打开文件
- if (pf == NULL)
- {
- perror("fopen");
- return 0;
- }
- fprintf(pf, "123456");//向文件中写入数据
- fclose(pf);
- pf = NULL;
- return 0;
- }
Как видите, данные записаны в файл. Далее мы используем функцию fscanf для вывода данных файла на экран:
- #include <stdio.h>
-
- int main()
- {
- char str[20] = { 0 };
- FILE* pf = fopen("test.txt", "r");//要读取数据,以读的形式打开文件
- if (pf == NULL)
- {
- perror("fopen");
- return 0;
- }
- fscanf(pf, "%s", str);//读取数据到str当中
- printf(str);
- fclose(pf);
- pf = NULL;
- return 0;
- }
Функция функции fseekНа основе положения и смещения указателя файлапозицияуказатель файла . Его прототип следующий:
int fseek ( FILE * stream, long int offset, int origin );
Его первый параметр — указатель файла, второй параметр — смещение относительно заданной позиции, а третий параметр — заданная позиция.
Язык C определяет триМакрос, вы можете выбрать один из них в качестве третьего параметра:
SEEK_SET: начальная позиция файла
SEEK_CUR: текущая позиция указателя файла.
SEEK_END: конец файла
Найдя указатель файла, мы можем читать или писать в указанном месте файла.
Функция ftell используется для возвратаСмещение указателя файла относительно начальной позиции . Прототип функции:
long int ftell ( ФАЙЛ * поток );
функция перемотки используется дляВернуть позицию указателя файла в начало файла . Прототип его функции:
void перемотка назад ( ФАЙЛ * поток );
1. Длятекстовый файл, мы можем сначала использоватьfgetcФункция циклически перебирает символы в файле до тех пор, пока не будет прочитан EOF, указываяЧтение файла завершено。
2. Длябинарный файл,Мы используемужасФункция определяет возвращаемое значение:Это меньше фактического числа, которое нужно прочитать? .Если оно меньшеЧтение заканчивается.
В двух вышеупомянутых случаях файлВ конце чтения, мы можем продолжать судитьПричина, по которой чтение файла завершилось . Введем две функции:феофиферрор。
феофФункция, используемая дляОпределить конец чтения файлапричинатак или иначеОбнаружен конец файла . Его прототип следующий:
int feof ( ФАЙЛ * поток );
Если файл вызванЧитать до конца файлаКогда чтение завершено, возвращается EOF, в других случаях возвращается 0;
феррорФункция, используемая дляОпределить конец чтения файлапричинатак или иначеПроизошла ошибка ввода-вывода . Прототип выглядит следующим образом:
int ferror ( ФАЙЛ * поток );
Если файл вызванПроизошла ошибка ввода-выводаПо завершении чтения возвращается ненулевое значение, в остальных случаях возвращается 0;
Далее мы пытаемся написать фрагмент кода, который будет определять окончание чтения файла:
- #include <stdio.h>
-
- int main()
- {
- int c = 0;
- FILE* fp = fopen("test.txt", "r");
- if (fp == NULL)
- {
- perror("fopen");
- return 0;
- }
- while ((c = fgetc(fp)) != EOF)//返回EOF则读取结束
- {
- putchar(c);
- }
- //判断读取结束的原因
- if (ferror(fp))
- puts("I/O错误n");
- else if (feof(fp))
- puts("文件读取结束n");
- fclose(fp);
- fp = NULL;
- return 0;
- }
Сегодня мы узнали об операциях с файлами, о том, как открывать и закрывать файлы, записывать или читать данные из файлов, функциях настройки указателей файлов и определении окончания чтения файлов. Если вы считаете, что то, что сказал блоггер, хорошо, поставьте, пожалуйста, небольшой лайк и спасибо за поддержку❤❤❤