Ввод-вывод файлов C: создание, открытие, чтение, запись и закрытие файла

⚡ Умное резюме

В языке C обработка файлов позволяет сохранять постоянные данные на диске с помощью библиотеки stdio, которая открывает файл с помощью fopen, записывает данные с помощью fputc, fputs или fprintf, читает данные с помощью fgetc, fgets или fscanf и закрывает файл с помощью fclose.

  • 📁 Режимы файлов: Строка режима, передаваемая функции fopen — r, w, a, r+, w+ или a+ — определяет, будет ли файл прочитан, перезаписан или добавлен в него данные.
  • ✍️ Запись данных: Функция fputc записывает один символ, функция fputs записывает строку, а функция fprintf записывает отформатированный текст в указатель файла.
  • ???? Чтение данных: fgetc считывает символ, fgets считывает строку в буфер, а fscanf анализирует отформатированные токены из файла.
  • 🔒 Закрытие файлов: Функция fclose очищает буферизованные данные и освобождает файл, возвращая 0 в случае успеха и EOF в случае неудачи.
  • 🔁 Интерактивный ввод-вывод: Функции getc и putc обрабатывают по одному символу за раз, перемещая ввод непосредственно в файл и обратно.
  • 🤖 Помощь ИИ: GitHub Copilot и ИИ-помощники создают шаблоны для функций fopen, fprintf и fgets, а также отмечают отсутствующие проверки на NULL или незакрытые файлы.

C-файлы ввода-вывода

C Управление файлами

Файл можно использовать для хранения больших объемов постоянных данных. Как и во многих других языках программирования, в языке C предусмотрена следующая система управления файлами. Функции,

  1. Создание файла
  2. Открытие файла
  3. Чтение файла
  4. Запись в файл
  5. Закрытие файла

Ниже приведены наиболее важные функции управления файлами, доступные в языке «C».

функция цель
fopen() Создание файла или открытие существующего файла
fзакрыть () Закрытие файла
fprintf() Запись блока данных в файл
фсканф () Чтение данных блока из файла
получить () Читает один символ из файла
путк () Записывает один символ в файл
получить () Считывает целое число из файла
путв () Запись целого числа в файл
поиск () Устанавливает положение указателя файла в указанное место
фтелл () Возвращает текущую позицию указателя файла
перемотка назад () Устанавливает указатель файла в начало файла

Как создать файл

Всякий раз, когда вы хотите работать с файлом, первым шагом является его создание. Файл — это не что иное, как пространство в памяти, где хранятся данные.

Для создания файла в программе на языке C используется следующий синтаксис:

FILE *fp;
fp = fopen ("file_name", "mode");

В приведенном выше синтаксисе файл представляет собой структуру данных, определенную в стандартной библиотеке.

fopen — стандартная функция, которая используется для открытия файла.

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

fp — это файл указатель который указывает на файл типа.

Всякий раз, когда вы открываете или создаете файл, вам необходимо указать, что вы собираетесь с ним делать. Файл в программировании на языке C можно создать или открыть для чтения/записи. Режим используется для указания, хотите ли вы открыть файл для какой-либо из перечисленных ниже целей. Ниже приведены различные типы режимов программирования на языке C, которые можно использовать при работе с файлом.

Файловый режим Описание
r Откройте файл для чтения. Если файл находится в режиме чтения, данные не удаляются, если файл уже присутствует в системе.
w Откройте файл для записи. Если файл находится в режиме записи, то новый файл создается, если файл вообще не существует. Если файл уже присутствует в системе, все данные внутри файла обрезаются и он открывается для записи.
a Откройте файл в режиме добавления. Если файл находится в режиме добавления, то он открывается. Содержимое файла при этом не изменяется.
r+ открыт для чтения и записи с самого начала
w+ открыть для чтения и записи, перезаписать файл
a+ открыт для чтения и записи, добавления в файл

В приведенном синтаксисе имя файла и режим указываются следующим образом: струны Следовательно, их всегда следует заключать в двойные кавычки.

Например:

#include <stdio.h>
int main() {
FILE *fp;
fp  = fopen ("data.txt", "w");
}

Выход:

Файл создается в той же папке, где вы сохранили свой код.

Создайте файл в выходных данных программы на языке C.

Вы можете указать путь, по которому хотите создать файл.

#include <stdio.h>
int main() {
FILE *fp;
fp  = fopen ("D://data.txt", "w");
}

Создайте файл с указанным путем в языке C.

Как закрыть файл

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

«C» предоставляет функцию fclose для выполнения операции закрытия файла. Синтаксис fclose следующий:

fclose (file_pointer);

Например:

FILE *fp;
fp  = fopen ("data.txt", "r");
fclose (fp);

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

После закрытия файла тот же указатель файла можно использовать и с другими файлами.

В программировании на языке C файлы автоматически закрываются при завершении программы. Закрытие файла вручную с помощью функции fclose — хорошая практика программирования.

Запись в файл

В C при записи в файл необходимо явно добавлять символы новой строки '\n'.

Библиотека stdio предлагает необходимые функции для записи в файл:

  • fputc(char, file_pointer): Эта функция записывает символ в файл, на который указывает file_pointer.
  • fputs(str, file_pointer): Эта функция записывает строку в файл, на который указывает file_pointer.
  • fprintf(file_pointer, str, variable_lists): Эта функция выводит строку в файл, на который указывает file_pointer. Строка может дополнительно содержать спецификаторы формата и список переменных variable_lists.

В программе ниже показано, как выполнить запись в файл:

функция fputc():

#include <stdio.h>
int main() {
        int i;
        FILE * fptr;
        char fn[50];
        char str[] = "Guru99 Rocks\n";
        fptr = fopen("fputc_test.txt", "w"); // "w" defines "writing mode"
        for (i = 0; str[i] != '\n'; i++) {
            /* write to file using fputc() function */
            fputc(str[i], fptr);
        }
        fclose(fptr);
        return 0;
    }

Выход:

Вывод функции fputc() на языке C

Приведенная выше программа записывает один символ в файл fputc_test.txt до тех пор, пока не достигнет следующего символа строки «\n», который указывает на успешное завершение записи предложения. Процесс заключается в том, чтобы взять каждый символ из массива и записать его в файл.

Содержимое файла fputc_test.txt написано на языке C.

  1. В приведенной выше программе мы создали и открыли файл fputc_test.txt в режиме записи и объявили нашу строку, которая будет записана в этот файл.
  2. Мы выполняем посимвольную операцию записи, используя цикл for, и помещаем каждый символ в наш файл до тех пор, пока не встретим символ «\n», затем файл закрывается с помощью функции fclose.

fputs() Функция:

#include <stdio.h>
int main() {
        FILE * fp;
        fp = fopen("fputs_test.txt", "w+");
        fputs("This is Guru99 Tutorial on fputs,", fp);
        fputs("We don't need to use for loop\n", fp);
        fputs("Easier than fputc function\n", fp);
        fclose(fp);
        return (0);
    }

Выход:

Вывод функции fputs() на языке C

Содержимое файла fputs_test.txt на языке C

  1. В приведенной выше программе мы создали и открыли файл fputs_test.txt в режиме записи.
  2. После выполнения операции записи с помощью функции fputs() мы записываем три разные строки.
  3. Затем файл закрывается с помощью функции fclose.

fprintf()Функция:

#include <stdio.h>
    int main() {
        FILE *fptr;
        fptr = fopen("fprintf_test.txt", "w"); // "w" defines "writing mode"
        /* write to file */
        fprintf(fptr, "Learning C with Guru99\n");
        fclose(fptr);
        return 0;
    }

Выход:

Вывод функции fprintf() на языке C

Содержимое файла fprintf_test.txt на языке C

  1. В приведенной выше программе мы создали и открыли файл fprintf_test.txt в режиме записи.
  2. После того, как операция записи выполняется с помощью функции fprintf() путем записи строки, файл закрывается с помощью функции fclose.

Чтение данных из файла

Существует три разные функции, предназначенные для чтения данных из файла.

  • fgetc(file_pointer): Эта функция возвращает следующий символ из файла, на который указывает указатель файла. Когда достигнут конец файла, возвращается EOF.
  • fgets(buffer, n, file_pointer): Эта функция считывает n-1 символов из файла и сохраняет строку в буфере, в который в качестве последнего символа добавляется нулевой символ '\0'.
  • fscanf(file_pointer, conversion_specifiers, variable_adresses): Эта функция используется для разбора и анализа данных. Она считывает символы из файла и присваивает входные данные списку указателей на переменные variable_adresses, используя спецификаторы преобразования. Имейте в виду, что, как и scanf, fscanf прекращает чтение строки при обнаружении пробела или символа новой строки.

Следующая программа демонстрирует чтение из файла fputs_test.txt с использованием функций fgets(), fscanf() и fgetc() соответственно:

#include <stdio.h>
int main() {
        FILE * file_pointer;
        char buffer[30], c;

        file_pointer = fopen("fprintf_test.txt", "r");
        printf("----read a line----\n");
        fgets(buffer, 50, file_pointer);
        printf("%s\n", buffer);

        printf("----read and parse data----\n");
        file_pointer = fopen("fprintf_test.txt", "r"); //reset the pointer
        char str1[10], str2[2], str3[20], str4[2];
        fscanf(file_pointer, "%s %s %s %s", str1, str2, str3, str4);
        printf("Read String1 |%s|\n", str1);
        printf("Read String2 |%s|\n", str2);
        printf("Read String3 |%s|\n", str3);
        printf("Read String4 |%s|\n", str4);

        printf("----read the entire file----\n");

        file_pointer = fopen("fprintf_test.txt", "r"); //reset the pointer
        while ((c = getc(file_pointer)) != EOF) printf("%c", c);

        fclose(file_pointer);
        return 0;
    }

Результат:

----read a line----
Learning C with Guru99

----read and parse data----
Read String1 |Learning|
Read String2 |C|
Read String3 |with|
Read String4 |Guru99|
----read the entire file----
Learning C with Guru99

Чтение данных из файла в C output

  1. В приведенной выше программе мы открыли файл «fprintf_test.txt», который был ранее создан с использованием функции fprintf(), и он содержит текст «Изучение C с помощью GuruСтрока размером 99 дюймов. Мы читаем её с помощью функции fgets(), которая считывает данные построчно, при этом размер буфера должен быть достаточным для обработки всей строки.
  2. Мы снова открываем файл, чтобы сбросить указатель на начало файла. Создаем различные строковые переменные для обработки каждого слова отдельно. Выводим содержимое переменных на экран. Функция fscanf() в основном используется для...tracи анализировать данные из файла.
  3. Откройте файл повторно, чтобы сбросить указатель файла на начало файла. Считайте данные и распечатайте их из файла посимвольно, используя функцию getc(), пока не встретите оператор EOF.
  4. После выполнения операции чтения файла с использованием разных вариантов мы снова закрыли файл с помощью функции fclose.

Интерактивное чтение и запись файлов с помощью getc и putc

Это простейшие файловые операции. Getc означает get символ, а putc означает put символ. Эти две функции используются для одновременной обработки только одного символа.

Следующая программа демонстрирует функции обработки файлов в программировании на языке «C»:

#include <stdio.h>
int main() {
        FILE * fp;
        char c;
        printf("File Handling\n");
        //open a file
        fp = fopen("demo.txt", "w");
        //writing operation
        while ((c = getchar()) != EOF) {
            putc(c, fp);
        }
        //close file
        fclose(fp);
        printf("Data Entered:\n");
        //reading
        fp = fopen("demo.txt", "r");
        while ((c = getc(fp)) != EOF) {
            printf("%c", c);
        }
        fclose(fp);
        return 0;
    }

Выход:

Интерактивное чтение и запись файлов в формате C.

Обработка выходных данных в файлах getc и putc на языке C.

  1. В приведенной выше программе мы создали и открыли файл под названием demo в режиме записи.
  2. После выполнения операции записи файл закрывается с помощью функции fclose.
  3. Мы снова открыли файл, который теперь содержит данные в режиме чтения. Цикл while будет выполняться до тех пор, пока не будет найден eof. Как только конец файла будет найден, операция будет прекращена, и данные будут отображены с помощью функции printf.
  4. После выполнения операции чтения файл снова закрывается с помощью функции fclose.

Часто задаваемые вопросы (FAQ)

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

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

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

Функция fseek перемещает указатель файла на смещение в байтах, измеренное относительно SEEK_SET, SEEK_CUR или SEEK_END. Функция ftell возвращает текущую позицию указателя в байтах, а функция rewind возвращает его в начало файла. Вместе они обеспечивают произвольный доступ вместо последовательного чтения.

fgets считывает целую строку, стоп.ping fscanf считывает отформатированные токены, разделенные пробелами, начиная с символа новой строки или после n-1 символов, поэтому он учитывает размер буфера. fscanf считывает отформатированные токены, разделенные пробелами, и может переполнить небольшой массив. Для безопасного чтения целых строк лучше использовать fgets.

EOF — это константа, обычно -1, которая отмечает конец файла. Функции чтения, такие как getc, fgetc и fscanf, возвращают EOF, когда данных больше нет, поэтому циклы сравнивают свой результат с EOF, чтобы остановить чтение.

Да. Искусственный интеллект, управляющий кодом, может генерировать процедуры fopen, fprintf и fgets из командной строки на обычном языке, объяснять каждый режим работы с файлами и выявлять ошибки, такие как отсутствие проверки на NULL или незакрытый файл. Всегда компилируйте и тестируйте предложенный ИИ код, прежде чем доверять ему.

Второй пилот GitHub Создаёт код обработки файлов на языке C, предлагая полные блоки fopen, fputs и fscanf на основе короткого комментария или имени функции. Часто добавляет соответствующий вызов fclose и проверку на ошибку, хотя всё равно следует проверить сгенерированную логику.

Подведем итог этой публикации следующим образом: