Обмен технологиями

[Язык C] Игра с файловыми операциями

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

🌟🌟Домашняя страница автора:эфемеры__

🌟🌟Принадлежащий столбец:язык Си

Оглавление

введение

1. Открытие и закрытие файлов

1. поток

2. Стандартный поток

3. Текстовые файлы и двоичные файлы.

4. Функции, управляющие открытием и закрытием файлов.

2. Последовательное чтение и запись файлов.

3. Случайное чтение и запись файлов.

1. функция fseek

2.функция ftell

3. функция перемотки

4. Определение окончания чтения файла

Подведем итог


введение

Когда мы пишем программы, мы часто храним данные в переменных. Если программа завершится и память будет освобождена, эти данные будут потеряны. Итак, есть ли у нас способ постоянно сохранять эти данные, чтобы они все еще существовали при повторном открытии программы? Ответ: да. Что можно сделать:Операции с файлами

1. Открытие и закрытие файлов

1. поток

Данные программы необходимо выводить на внешние устройства, а также их необходимо вводить с внешних устройств. Для разных устройств методы ввода и вывода различны. Чтобы облегчить наши операции с различными устройствами ввода и вывода, у нас есть весьма абстрактное понятие «поток». В языке C операции ввода и вывода с файлами, экранами, клавиатурами и т. д. выполняются посредством «потоков». В общем, если мы хотим записать или прочитать данные, нам нужно открыть поток.

2. Стандартный поток

Когда запускается программа на языке C, по умолчанию онатри ручьяДля нас уже открыты:

стандартный ввод--Стандартный поток ввода, в большинстве случаев ввод с клавиатуры.

стандартный вывод--Стандартный поток вывода, в большинстве случаев вывод на монитор.

stderr--Стандартный поток ошибок, в большинстве случаев выводимый на монитор.

Поскольку эти три потока открыты по умолчанию, мы можем напрямую выполнять операции ввода и вывода, используя такие функции, как scanf и printf.

Эти три потока также имеют типы. Их типы:Указатель файла (FILE*) .Когда мы выполняем файловые операции, мы передаемПеременная указателя файла может косвенно найти связанный с ней файл.

3. Текстовые файлы и двоичные файлы.

В зависимости от того, как организованы данные, файлы данных называютсятекстовый файлилибинарный файл . Данные хранятся в двоичной форме в памяти,Если он выводится во внешний файл хранения без преобразования, этобинарный файл
Если его необходимо сохранить в коде ASCII во внешнем хранилище, его необходимо преобразовать перед сохранением.Файл, хранящийся в виде символов ASCII,текстовый файл
Как часть данных хранится в файле?
Символы всегда сохраняются в форме ASCII, а числовые данные могут храниться как в ASCII, так и в двоичной форме. Например, если имеется целое число 10000, то если оно выводится на диск в виде ASCII-кода, оно займет на диске 5 байт (по одному байту на каждый символ), а если выводится в двоичном виде, то оно будет занимать на диске всего 4 байта.

4. Функции, управляющие открытием и закрытием файлов.

Разобравшись с этими необходимыми знаниями, давайте перейдем к сути — открытию и закрытию файлов. Язык C предоставляет две функции, которые отвечают за открытие и закрытие файлов соответственно. Прототипы следующие:

открыть файл:
ФАЙЛ * fopen ( const char * имя файла, const char * режим );
Закройте файл:
инт fclose ( ФАЙЛ * поток );

Функция fopen имеет два параметра:Первый параметр выражается в виде строкиимя файла, второй параметр — это файлОткрытый метод, представленный строкой .При использовании этой функции нам необходимо создатьпеременная указателя файла Чтобы получить, когда файл не открывается, он возвращает нулевой указатель. Что касается способов открытия, то здесь можно выделить следующие:

Открытый методзначениеЕсли указанный файл не существует
«р» (только чтение)
Для ввода данных откройте существующий текстовый файл
Возвращает нулевой указатель
"w" (только запись)
Для вывода данных откройте текстовый файл
Создать новый файл
«а» (добавить)Добавить данные в конец текстового файлаСоздать новый файл
«рб» (только чтение)Для ввода данных откройте бинарный файлВозвращает нулевой указатель
"wb" (только запись)Для вывода данных откройте двоичный файлСоздать новый файл
«аб» (добавить)Добавить данные в конец двоичного файлаСоздать новый файл
«r+» (читать и писать)Для чтения и записи откройте текстовый файлВозвращает нулевой указатель
«w+» (читать и писать)Для чтения и записи создайте новый текстовый файл.Создать новый файл
«а+» (читать и писать)Откройте файл, прочитайте и напишите в конце файла.Создать новый файл
«rb+» (чтение и запись)Откройте двоичный файл для чтения и записи.Возвращает нулевой указатель
«wb+» (чтение и запись)
Для чтения и записи создайте новый двоичный файл.Создать новый файл
«ab+» (читать и писать)
Откройте двоичный файл, прочитайте и напишите в конце файла.Создать новый файл

Для функции fclose ее параметром является указатель файла, который используется для закрытия файла, на который указывает указатель файла.

Далее пытаемся открыть и закрыть файл:

  1. #include <stdio.h>
  2. int main()
  3. {
  4. FILE* pf = fopen("test.txt", "w");
  5. if (pf == NULL)//文件打开失败则退出程序
  6. {
  7. perror("fopen");
  8. return 0;
  9. }
  10. printf("文件打开成功n");
  11. fclose(pf);
  12. pf = NULL;//避免出现野指针,及时制空
  13. return 0;
  14. }
результат операции:

Видно, что, поскольку метод открытия — «w», в пути действительно появляется файл с именем «test.txt».

2. Последовательное чтение и запись файлов.

Далее мы введем несколько функций дляЧтение или запись данных в файл

Имя функцииФункцияПрименимый к
fgetcФункция ввода символовВсе входные потоки
fputcфункция вывода символовВсе выходные потоки
fgetsФункция ввода текстовой строкиВсе входные потоки
fputsФункция вывода текстовой строкиВсе выходные потоки
fscanfФункция ввода форматаВсе входные потоки
fprintfФункция вывода формата Все выходные потоки
ужасДвоичный входВходной поток файла
fwriteДвоичный выходВыходной поток файла

Далее мы пытаемся использоватьfscanfиfprintfфункция:

Первым параметром этих двух функций является указатель файла, который используется для чтения и записи данных файла. Последующие параметры такие же, как у функций scanf и printf.

  1. #include <stdio.h>
  2. int main()
  3. {
  4. FILE* pf = fopen("test.txt", "w");//要写入数据,以写的形式打开文件
  5. if (pf == NULL)
  6. {
  7. perror("fopen");
  8. return 0;
  9. }
  10. fprintf(pf, "123456");//向文件中写入数据
  11. fclose(pf);
  12. pf = NULL;
  13. return 0;
  14. }

Как видите, данные записаны в файл. Далее мы используем функцию fscanf для вывода данных файла на экран:

  1. #include <stdio.h>
  2. int main()
  3. {
  4. char str[20] = { 0 };
  5. FILE* pf = fopen("test.txt", "r");//要读取数据,以读的形式打开文件
  6. if (pf == NULL)
  7. {
  8. perror("fopen");
  9. return 0;
  10. }
  11. fscanf(pf, "%s", str);//读取数据到str当中
  12. printf(str);
  13. fclose(pf);
  14. pf = NULL;
  15. return 0;
  16. }
результат операции:

3. Случайное чтение и запись файлов.

1. функция fseek

Функция функции fseekНа основе положения и смещения указателя файлапозицияуказатель файла . Его прототип следующий:

int fseek ( FILE * stream, long int offset, int origin );

Его первый параметр — указатель файла, второй параметр — смещение относительно заданной позиции, а третий параметр — заданная позиция.

Язык C определяет триМакрос, вы можете выбрать один из них в качестве третьего параметра:

SEEK_SET: начальная позиция файла

SEEK_CUR: текущая позиция указателя файла.

SEEK_END: ​​конец файла

Найдя указатель файла, мы можем читать или писать в указанном месте файла.

2.функция ftell

Функция ftell используется для возвратаСмещение указателя файла относительно начальной позиции . Прототип функции:

long int ftell ( ФАЙЛ * поток );

3. функция перемотки

функция перемотки используется дляВернуть позицию указателя файла в начало файла . Прототип его функции:

void перемотка назад ( ФАЙЛ * поток );

4. Определение окончания чтения файла

1. Длятекстовый файл, мы можем сначала использоватьfgetcФункция циклически перебирает символы в файле до тех пор, пока не будет прочитан EOF, указываяЧтение файла завершено

2. Длябинарный файл,Мы используемужасФункция определяет возвращаемое значение:Это меньше фактического числа, которое нужно прочитать? .Если оно меньшеЧтение заканчивается.

В двух вышеупомянутых случаях файлВ конце чтения, мы можем продолжать судитьПричина, по которой чтение файла завершилось . Введем две функции:феофиферрор

феофФункция, используемая дляОпределить конец чтения файлапричинатак или иначеОбнаружен конец файла . Его прототип следующий:

int feof ( ФАЙЛ * поток );

Если файл вызванЧитать до конца файлаКогда чтение завершено, возвращается EOF, в других случаях возвращается 0;

        феррорФункция, используемая дляОпределить конец чтения файлапричинатак или иначеПроизошла ошибка ввода-вывода . Прототип выглядит следующим образом:

int ferror ( ФАЙЛ * поток );

Если файл вызванПроизошла ошибка ввода-выводаПо завершении чтения возвращается ненулевое значение, в остальных случаях возвращается 0;

Далее мы пытаемся написать фрагмент кода, который будет определять окончание чтения файла:

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int c = 0;
  5. FILE* fp = fopen("test.txt", "r");
  6. if (fp == NULL)
  7. {
  8. perror("fopen");
  9. return 0;
  10. }
  11. while ((c = fgetc(fp)) != EOF)//返回EOF则读取结束
  12. {
  13. putchar(c);
  14. }
  15. //判断读取结束的原因
  16. if (ferror(fp))
  17. puts("I/O错误n");
  18. else if (feof(fp))
  19. puts("文件读取结束n");
  20. fclose(fp);
  21. fp = NULL;
  22. return 0;
  23. }

Подведем итог

Сегодня мы узнали об операциях с файлами, о том, как открывать и закрывать файлы, записывать или читать данные из файлов, функциях настройки указателей файлов и определении окончания чтения файлов. Если вы считаете, что то, что сказал блоггер, хорошо, поставьте, пожалуйста, небольшой лайк и спасибо за поддержку❤❤❤