Управление файлами в программировании — это задача, в которой программист должен хорошо разбираться. Знание различных функций открытия, чтения и записи имеет важное значение, поскольку они всегда нужны нам для хранения или удаления информации, хранящейся в файлах.
В этой статье Linux Hint вы узнаете, как использовать функцию write() для записи файлов.
Мы объясним все об этой элле, ее синтаксисе, методе вызова, входных и выходных аргументах, типах данных, которые она принимает в каждом случае, и как ее правильно объявить.
Затем мы применяем то, что узнали, поместив использование этой функции в практические примеры, которые мы подготовили для вас с фрагментами кода и изображениями, демонстрирующими использование write() в языке C.
Для того, чтобы вы имели исчерпывающие знания об использовании функции write(), мы добавили специальный раздел, в котором описаны отдельные ошибки, которые могут возникнуть при использовании этой функции, а также их обнаружение и идентификация, чтобы у вас была необходимые приемы для быстрого решения в случае их возникновения.
Синтаксис функции Write() в языке C
инт писать ( инт фд , пустота * буф , size_t н ) ;Описание функции Write() на языке C
Функция write() записывает в открытый файл. Эта функция записывает содержимое буфера, на который указывает «buf», в файл, указанный его дескриптором во входном аргументе «fd». Размер блока, который будет записан в файл, должен быть указан во входном аргументе «n».
Чтобы иметь возможность писать с помощью функции write(), файл должен быть открыт с помощью функции open() и указан в атрибутах O_RDONLY или O_RDWR. В противном случае эта функция не действует.
Если вызов успешен, он возвращает количество введенных символов. Если при записи возникает ошибка, он возвращает результат, равный -1. Идентификационный код, указывающий на ошибку, можно получить из глобальной переменной errno, которая определена в заголовке «errno.h».
Позже вы найдете раздел, в котором мы объясним, как обнаруживать и идентифицировать наиболее распространенные ошибки этой функции.
Функция write() определена в заголовке unistd.h. Флаги, определяющие атрибуты и режим открытия файла, определены в «fcntl.h». Чтобы использовать функции open() и write(), вы должны включить эти заголовки в свой код следующим образом:
#include#include
Как записать в файл с помощью функции Write() на языке C
В этом примере мы записываем пустой текстовый файл с именем «example.txt», который мы создали ранее в каталоге «Документы».
Первый шаг — вставить необходимые заголовки. Внутри функции main() откройте файл с помощью функции open(). Для этого нам нужно объявить целое число «fd», которое служит файловым дескриптором, и 1024-символьный буферный массив «buf», содержащий текст, который мы хотим записать в файл. В этом буфере мы храним первый абзац справочной страницы GCC, чтобы записать его в файл «example.txt».
После открытия файла с помощью функции open() в режиме чтения/записи мы записываем в файл, вызывая функцию write() и передавая файловый дескриптор «fd» в качестве первого входного аргумента, указатель «buf» в качестве второго аргумент, а размер строки, содержащейся в массиве, в качестве третьего аргумента, который мы получаем с помощью функции strlen(). Вот код для этого примера:
#include#include
#include
#include
#include
#include
#include
пустота основной ( )
{
инт фд ;
уголь буфер [ 1024 ] '=' «Когда вы вызываете GCC, он обычно выполняет предварительную обработку, компиляцию, сборку и компоновку. Общие параметры позволяют вам остановить этот процесс на промежуточном этапе. Например, параметр -c говорит не запускать компоновщик. объектные файлы, выводимые ассемблером». ;
фд '=' открыть ( 'Документы/пример.txt' , O_RDWR ) ;
писать ( фд , & буфер , стрлен ( буфер ) ) ;
закрывать ( фд ) ;
}
На следующем рисунке мы видим компиляцию и выполнение этого кода вместе с открытым файлом, который записывается функцией write():
Как добавить текст в конец файла с помощью функции Write() на языке C
Когда файл открывается с указанием флагов O_WRONLY или O_RDWR, курсор переходит на первую позицию и начинает запись оттуда.
Чтобы добавить текст в конец файла, он должен быть указан с помощью логической операции ИЛИ между флагами O_WRONLY или O_RDWR и флагом O_ APPEND во входном аргументе flags функции open() при открытии файла. Таким образом, курсор помещается в конец файла, и запись начинается оттуда. Кроме того, атрибуты и режим записи можно изменить после открытия файла с помощью функции fcntl().
На следующем рисунке вы можете увидеть код, который добавляет текст в конец файла, который мы написали в предыдущем примере:
#include#include
#include
#include
#include
#include
#include
пустота основной ( )
{
инт фд ;
уголь буфер [ 1024 ] '=' «Этот текст добавлен. Этот текст добавлен». ;
фд '=' открыть ( 'Документы/пример.txt' , O_RDWR | O_APPEND ) ;
писать ( фд , & буфер , стрлен ( буфер ) ) ;
закрывать ( фд ) ;
}
На следующем изображении показан добавленный текст. Как видите, при таком методе открытия функция write() начинает запись с позиции последнего символа, записанного в файл:
Как обнаружить и идентифицировать ошибки, которые могут возникнуть при использовании функции Write() в языке C
Использование write() может генерировать различные ошибки. Когда это происходит, эта функция возвращает результат, равный -1.
Самый простой способ определить, произошла ли ошибка, — использовать условие «если», где условием является возвращаемое значение -1. Теперь давайте посмотрим, как вы можете использовать этот метод, чтобы определить, произошла ли ошибка:
инт н ;н '=' писать ( фд , & буфер , стрлен ( буфер ) ) ;
если ( н == - 1 ) {
printf ( 'Произошла ошибка при попытке записи файла.' ) ;
}
Если функция write() возвращается с ошибкой, она переходит к оператору «if» и печатает сообщение « Произошла ошибка при попытке записи файла “.
При возникновении ошибки числовой код автоматически сохраняется в глобальной переменной errno, которая определена в заголовке «errno.h». Этот код можно использовать для идентификации возникшей ошибки.
Ниже приведен отрывок с ошибками, которые может генерировать функция write() и которые определены в заголовке «errno.h», а также краткое описание каждой ошибки и соответствующее целочисленное значение:
Определение | Значение в ошибке | Ошибка |
---|---|---|
СНОВА | одиннадцать | Попробуйте еще раз. |
ЭБАДФ | 9 | Неверный номер файла. |
ЭДЕСТАДДРРЕК | 89 | Требуется адрес назначения. |
ЭДКО | 122 | Превышена квота. |
НЕИСПРАВНОСТЬ | 14 | Неверный адрес. |
ЭФБИГ | 27 | Файл слишком большой. |
EINTR | 4 | Системный вызов прерван. |
ОДИН ВЫБОР | 22 | Недействительным аргумент. |
ЭИО | 5 | Ошибка ввода-вывода. |
ENOSPC | 28 | На устройстве не осталось свободного места. |
Верхний | 1 | Операция запрещена. |
Самый простой способ идентифицировать ошибку — разомкнуть переключатель, где переменная errno — это условие перехода, а каждый случай — определение ошибки.
Далее рассмотрим пример, в котором мы пытаемся ввести дескриптор с отрицательным знаком, что приводит к ошибке. Чтобы определить ошибку, мы используем условие «если», которое мы видели в предыдущем фрагменте. Для ее выявления вскрываем переключатель с тремя наиболее распространенными ошибками, которые может выдавать эта функция.
#include#include
#include
#include
#include
#include
#include <ошибка.h>
пустота основной ( )
{
инт фд ;
инт н ;
уголь буфер [ 1024 ] '=' 'Привет, мир' ;
фд '=' открыть ( 'Документы/пример.txt' , O_RDWR ) ;
н '=' писать ( - 2 , & буфер , стрлен ( буфер ) ) ;
если ( н == - 1 ) {
выключатель ( ошибаться ) {
случай ЭБАДФ : {
printf ( «Неверный номер файла. Ошибка: %i \n ' , ошибаться ) ;
перерыв ; }
случай ОДИН ВЫБОР : {
printf ( 'Недопустимый аргумент. Ошибка: %i \n ' , ошибаться ) ;
перерыв ; }
случай ЭИО : {
printf ( 'Ошибка ввода/вывода. Ошибка: %i \n ' , ошибаться ) ;
перерыв ; }
}
}
}
Как мы видим на следующем рисунке, функция write() возвращает ошибку, когда в качестве входного аргумента передается недопустимый дескриптор. Значение, полученное из переменной errno, используется в качестве условия перехода, которое позволяет нам идентифицировать ошибку при входе в случай EBADF.
Заключение
В этой статье Linux Hint мы показали вам, как использовать функцию write() для записи в файлы. Мы показали вам синтаксис и теоретическое описание этой функции. Мы также объяснили методы обнаружения и идентификации ошибок, чтобы у вас были необходимые инструменты и методы для быстрого решения этих проблем.
Чтобы помочь вам понять, как работает write(), мы реализовали использование этой функции в практических примерах с кодами и изображениями, которые показывают использование этой и других функций обработки файлов.
Мы также показали вам, как выбрать режим открытия файла, чтобы вставить текст в начало или в конец файла, и какие функции доступны для изменения этих атрибутов.