Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> Язык C

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

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

Файл представляет собой последовательность байтов, независимо от того, является ли он текстовым или двоичным файлом. Язык программирования C обеспечивает доступ к функциям высокого уровня, а также к низкоуровневым (на уровне ОС) вызовам для обработки файлов на ваших устройствах хранения. В этой главе вы познакомитесь с важными функциями управления файлами.

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

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

FILE *fopen( const char * filename, const char * mode );

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

<тд>

р

Открывает существующий текстовый файл для чтения.

<тд>

ж

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

<тд>

а

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

<тд>

г+

Открывает текстовый файл для чтения и записи.

<тд>

ж+

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

<тд>

а+

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

Серийный номер Режим и описание
1
2
3
4
5
6

Если вы собираетесь работать с бинарными файлами, то вы будете использовать следующие режимы доступа вместо упомянутых выше —

"rb", "wb", "ab", "rb+", "r+b", "wb+", "w+b", "ab+", "a+b"

Закрытие файла

Чтобы закрыть файл, используйте функцию fclose(). Прототип этой функции —

int fclose( FILE *fp );

fclose(-) функция возвращает ноль в случае успеха или EOF если есть ошибка при закрытии файла. Эта функция фактически сбрасывает все данные, все еще ожидающие в буфере, в файл, закрывает файл и освобождает всю память, используемую для файла. EOF — это константа, определенная в заголовочном файле stdio.h. .

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

Запись файла

Ниже приведена простейшая функция для записи отдельных символов в поток —

int fputc( int c, FILE *fp );

Функция fputc() записывает символьное значение аргумента c в выходной поток, на который ссылается fp. Он возвращает письменный символ, записанный в случае успеха, в противном случае EOF если есть ошибка. Вы можете использовать следующие функции для записи строки с завершающим нулем в поток —

int fputs( const char *s, FILE *fp );

Функция fputs() записывает строку s в выходной поток, на который ссылается fp. В случае успеха возвращает неотрицательное значение, в противном случае EOF возвращается в случае какой-либо ошибки. Вы можете использовать int fprintf(FILE *fp,const char *format, ...) Функция также для записи строки в файл. Попробуйте следующий пример.

Убедитесь, что у вас есть /tmp каталог доступен. Если это не так, то прежде чем продолжить, вы должны создать этот каталог на своем компьютере.

#include <stdio.h>

main() {
   FILE *fp;

   fp = fopen("/tmp/test.txt", "w+");
   fprintf(fp, "This is testing for fprintf...\n");
   fputs("This is testing for fputs...\n", fp);
   fclose(fp);
}

Когда приведенный выше код скомпилирован и выполнен, он создает новый файл test.txt. в каталоге /tmp и записывает две строки, используя две разные функции. Давайте прочитаем этот файл в следующем разделе.

Чтение файла

Ниже приведена простейшая функция для чтения одного символа из файла —

int fgetc( FILE * fp );

fgetc() функция читает символ из входного файла, на который ссылается fp. Возвращаемое значение — это прочитанный символ, или в случае ошибки возвращается EOF . Следующая функция позволяет прочитать строку из потока —

char *fgets( char *buf, int n, FILE *fp );

Функции fgets() считывает до n-1 символов из входного потока, на который ссылается fp. Он копирует прочитанную строку в буфер buf , добавив null символ для завершения строки.

Если эта функция встречает символ новой строки '\n' или конец файла EOF до того, как будет прочитано максимальное количество символов, она возвращает только символы, прочитанные до этой точки, включая символ новой строки. Вы также можете использовать int fscanf(FILE *fp, const char *format, ...) функция для чтения строк из файла, но она прекращает чтение после встречи с первым символом пробела.

#include <stdio.h>

main() {

   FILE *fp;
   char buff[255];

   fp = fopen("/tmp/test.txt", "r");
   fscanf(fp, "%s", buff);
   printf("1 : %s\n", buff );

   fgets(buff, 255, (FILE*)fp);
   printf("2: %s\n", buff );
   
   fgets(buff, 255, (FILE*)fp);
   printf("3: %s\n", buff );
   fclose(fp);

}

Когда приведенный выше код компилируется и выполняется, он считывает файл, созданный в предыдущем разделе, и выдает следующий результат —

1 : This
2: is testing for fprintf...

3: This is testing for fputs...

Давайте посмотрим немного подробнее о том, что здесь произошло. Во-первых, fscanf() прочитать только это потому что после этого он столкнулся с пробелом, второй вызов для fgets() который читает оставшуюся строку, пока не встретит конец строки. Наконец, последний вызов fgets() полностью читает вторую строку.

Двоичные функции ввода/вывода

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

size_t fread(void *ptr, size_t size_of_elements, size_t number_of_elements, FILE *a_file);
              
size_t fwrite(const void *ptr, size_t size_of_elements, size_t number_of_elements, FILE *a_file);

Обе эти функции следует использовать для чтения или записи блоков памяти — обычно это массивы или структуры.


Язык C

  1. C Вход Выход (ввод/вывод)
  2. C Обработка файлов
  3. Файловый ввод-вывод Python
  4. Axiomtek:многофункциональная система для приложений машинного зрения
  5. Acceed:модули ввода-вывода для масштабируемой передачи данных
  6. С - Функции
  7. C — заголовочные файлы
  8. Что такое карты ввода-вывода и как они работают
  9. MATLAB — вывод данных
  10. С# — файловый ввод-вывод