popov . dev

Main

Library

Articles

Обработка файлов...

Обработка файлов на языке Си

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

Знаете ли вы, что обработка файлов в C позволяет вам не только читать из файлов и выполнять запись в них, но и создавать, удалять и манипулировать ими множеством способов?

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

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

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

Чтобы создать файл на C, вы объявляете указатель типа FILE и используете функцию fopen(), которая расшифровывается как file open (открыть файл). Эта функция принимает два аргумента:

  • Имя файла (имя файла, который вы хотите создать)
  • Режим работы в формате строки.
FILE *myfile; // *myfile указатель на тип FILE
myfile = fopen("имя_файла", "режим_работы")

Режимы работы

Режимы работы - это символы (алфавиты), которые определяют режим доступа к файлу на языке C. Строка режима определяет, как вы хотите открыть файл: для чтения, записи или добавления, и следует ли создавать файл, если он еще не существует.

Типы строк режимов

  • r - режим только для чтения, файл должен существовать.
  • w - режим только для записи, создает/обрезает файл.
  • a - режим добавления, создает файл, если он не существует.
  • r+ - режим чтения/записи, файл должен существовать.
  • w+ - режим чтения/записи, создает/обрезает файл.
  • a+ - режим чтения/добавления, создает файл, если он не существует.

Пример:

#include <stdio.h>
int main(void)
{
    FILE *myfileptr;
    myfileptr = fopen("example.txt", "w");

    fclose(myfileptr);
    return 0;
}
  • #include <stdio.h>: Включает стандартную библиотеку ввода-вывода, необходимую для функций обработки файлов.
  • int main(void): Определяет основную функцию, точку входа в программу.
  • FILE *myfileptr;: Объявляет указатель myfileptr типа FILE, который будет использоваться для представления файла.
  • myfileptr = fopen("example.txt", "w");: Открывает файл с именем "example.txt" в режиме записи ("w"). Если файл не существует, он будет создан. Если он действительно существует, его содержимое будет усечено (стерто). То
  • функция fopen() возвращает указатель на открытый файл, который затем присваивается myfileptr.
  • fclose(myfileptr);: Закрывает файл, представленный myfileptr. Этот шаг необходим для того, чтобы убедиться, что все буферизованные данные записаны в файл и что системные ресурсы освобождены должным образом.
  • return 0;: Указывает на то, что выполнение программы прошло успешно, и завершает основную функцию.
Примечание: файл example.txt будет создан на диске вашего компьютера. По умолчанию он будет создан в том же каталоге, где находится исполняемый файл вашей программы на C, если только вы не укажете другой путь при вызове функции fopen().
❯ ls -l
total 128
-rw-r--r--  1 denis  staff      0 Jul 14 10:20 example.txt
-rw-r--r--  1 denis  staff    234 Jul 14 10:19 main.c
-rw-r--r--  1 denis  staff    776 Jul 14 10:19 main.o
-rwxr-xr-x  1 denis  staff  49424 Jul 14 10:19 program

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

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

Как выполнить запись в файл

Чтобы начать запись в файл, мы должны объявить переменную указатель с типом FILE. По сути, файл необходимо открыть, и мы делаем это с помощью функции fopen().

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

Затем мы используем такие функции, как fprintf() или fwrite(), для записи данных в файл. fprintf() обычно используется для форматированного вывода, в то время как fwrite() используется для двоичных данных.

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

Давайте возьмем простой пример:

#include <stdio.h>

int main() {
    FILE *myfileptr; // Объявляем указатель на FILE
    
    // Открываем файл example.txt в режиме записи ("w")
    fptr = fopen("example.txt", "w");
    
    // Проверяем что файл успешно открыт
    if (myfileptr == NULL) {
        printf("Ошибка открытия файла!\n");
        return 1; // Возвращаем код ошибки
    }
    
    // Запись данных в файл с помощью fprintf()
    fprintf(myfileptr, "Привет мир!\n");
    
    // Закрытие файла
    fclose(myfileptr);
    
    return 0;
}

После запуска этой программы вы найдете файл с именем example.txt в том же каталоге, что и ваша программа, содержащий текст "Привет мир!".

❯ cat example.txt
Привет мир!
Примечания: при записи в существующий файл предыдущее содержимое перезаписывается. Об этом важно знать, так как это может привести к непреднамеренному удалению существующих данных.

Добавление содержимого в файл

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

include <stdio.h>

int main() {
    FILE *myfileptr; // Объявление указателя на файл
    
    // Открытие файла example.txt в режиме добавления ("a")
    myfileptr = fopen("example.txt", "a");
    
    // Проверяем что файл успешно открыт
    if (myfileptr == NULL) {
        printf("Ошибка открытия файла!\n");
        return 1; // Возвращаем код ошибки
    }
    
    // Добавляем данные в файл с помощью fprintf()
    fprintf(myfileptr, "Это еще одна строка.\n");
    
    // Закрытие файла
    fclose(myfileptr);
    
    printf("Данные добавлены в файл успешно!\n");
    
    return 0;
}
❯ cat example.txt
Привет мир!
Это еще одна строка.
Примечание: режим a работает так же, как и режим w, он создает новый файл, если файл не существует, и добавляет содержимое

Чтение файлов

Чтение файлов на языке Си намного отличается от записи и добавления.

Для чтения из файла вы используете режим r.

FILE *myfileptr,
 
myfileptr = fopen("example.txt", "r");  // Открывает файл для чтения

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

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

FILE *myfileptr,
 
myfileptr = fopen("example.txt", "r");  // Открываем файл для чтения

char fileString[100];  // Хранилище для содержимого файла

Теперь давайте рассмотрим функцию под названием fgets()

fgets()

fgets() - это библиотечная функция языка Си, используемая для чтения строки текста из файлового потока или стандартного ввода (stdin).

функция fgets() считывает символы из потока файлов и сохраняет их в указанной строке до тех пор, пока не будет прочитано n-1 символов, не встретится символ новой строки \n (который также копируется в str) или не будет достигнут конец файла.

По сути, fgets() - это как чтение строки из книги. Он считывает символы из файла или вводит их (например, набирает текст на клавиатуре) и помещает их в поле (строку букв) до тех пор, пока оно не заполнится, не найдет новую строку (нажав Enter) или не достигнет конца страницы (конца файла).

fgets(fileString, 100, myfileptr); 

// fgets принимает 3 параметра (str, n, stream)
  • fileString: это указатель на массив, в котором будет сохранена строка, считанная из файла или входного потока. Это место, куда будут помещены символы.
  • 100: этот параметр определяет максимальное количество символов, которые должны быть скопированы в массив, на который указывает fileString, включая символ нулевого завершения \0. Это помогает предотвратить переполнение буфера, ограничивая количество считываемых символов.
  • myfileptr: это указатель на файловый объект, который идентифицирует файловый поток, из которого функция fgets() будет считывать строку текста. Это может быть файл, который вы открыли с помощью функции fopen(), или это может быть стандартный ввод для чтения с помощью стандартного ввода (обычно с клавиатуры).

Теперь давайте расставим все по местам

#include <stdio.h>

int main(void) {
    FILE *myfileptr;

    // Открытие файла в режиме чтения
    myfileptr= fopen("example.txt", "r");

    // Хранилище для содержимого файла
    char fileString[100];

    // Чтение содержимого и сохранение в fileString
    fgets(fileString, 100, myfileptr);

    // Вывод содержимого файла
    printf("%s", fileString); // Выведет Привет мир!

    // Закрытие файла
    fclose(myfileptr);

    return 0;
}
Примечане: функция fgets() считывает только начальную строку файла. Если вы помните, example.txt содержит две строки текста. Чтобы прочитать все строки, вы можете использовать цикл while

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

#include <stdio.h>

int main(void) {
    FILE *myfileptr;

    // Открытие файла в режиме чтения
    myfileptr= fopen("example.txt", "r");

    // Хранилище для содержимого файла
    char fileString[100];

    // Чтение содержимого, сохранение в fileString и вывод
    while(fgets(fileString, 100, myfileptr)) {
        printf("%s", fileString);
    }

    // Закрытие файла
    fclose(myfileptr);

    return 0;
}

Вывод

Привет мир!
Это еще одна строка.

Comments

In order to leave your opinion, you need to register on the website