Учебники

Компьютерное программирование – Файловый ввод / вывод

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

Компьютерные файлы можно рассматривать как цифровой аналог бумажных документов. При программировании исходный код хранится в текстовых файлах с различными расширениями, например, файлы программирования на C заканчиваются расширением .c , файлы программирования Java – на .java , а файлы Python – на .py .

Ввод / вывод файла

Обычно вы создаете файлы с помощью текстовых редакторов, таких как блокнот, MS Word, MS Excel или MS Powerpoint и т. Д. Однако, часто нам также нужно создавать файлы с помощью компьютерных программ. Мы можем изменить существующий файл с помощью компьютерной программы.

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

Пока достаточно вспомнить, что запись в файл – это ввод файла, а чтение чего-либо из файла – вывод файла.

Режимы работы с файлами

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

  • Режим только для чтения – если вы собираетесь просто прочитать существующий файл и не хотите записывать в него какой-либо другой контент, то вы откроете файл в режиме только для чтения. Почти все языки программирования предоставляют синтаксис для открытия файлов в режиме только для чтения.

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

  • Режим чтения и записи – если вы собираетесь читать и писать в один и тот же файл, то вы откроете файл в режиме чтения и записи.

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

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

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

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

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

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

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

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

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

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

Sr.No Режим и описание
1

р

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

2

вес

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

3

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

4

г +

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

5

ш +

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

6

а +

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

р

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

вес

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

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

г +

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

ш +

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

а +

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

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

Чтобы закрыть файл, используйте функцию 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, …) для записи строки в файл. Попробуйте следующий пример –

#include <stdio.h>

int 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 , добавляя нулевой символ для завершения строки.

Если эта функция встречает символ новой строки ‘\ 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 () полностью читает вторую строку.

Файловый ввод / вывод в Java

Java предоставляет еще более богатый набор функций для обработки файлового ввода-вывода. Для получения дополнительной информации по этой теме мы рекомендуем вам ознакомиться с нашими учебными руководствами по Java.

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

import java.io.*;

public class DemoJava {
   public static void main(String []args) throws IOException {
      File file = new File("/tmp/java.txt");
      
      // Create a File
      file.createNewFile();
      
      //  Creates a FileWriter Object using file object
      FileWriter writer = new FileWriter(file); 
      
      // Writes the content to the file
      writer.write("This is testing for Java write...\n");
      writer.write("This is second line...\n");
      
      // Flush the memory and close the file
      writer.flush();
      writer.close();
      
      // Creates a FileReader Object
      FileReader reader = new FileReader(file); 
      char [] a = new char[100];
      
      // Read file content in the array
      reader.read(a);
      System.out.println( a );
      
      // Close the file
      reader.close();
   }
}

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

This is testing for Java write...
This is second line...

Файловый ввод / вывод в Python

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

# Create a new file
fo = open("/tmp/python.txt", "w")

# Writes the content to the file
fo.write( "This is testing for Python write...\n");
fo.write( "This is second line...\n");

# Close the file
fo.close()

# Open existing file
fo = open("/tmp/python.txt", "r")

# Read file content in a variable
str = fo.read(100);
print str

# Close opened file
fo.close()

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