Компьютерное программирование - Файловый ввод-вывод
Компьютерные файлы
Компьютерный файл используется для хранения данных в цифровом формате, например, обычного текста, изображений или любого другого содержимого. Компьютерные файлы могут быть организованы в разных каталогах. Файлы используются для хранения цифровых данных, тогда как каталоги используются для хранения файлов.
Компьютерные файлы можно рассматривать как цифровую копию бумажных документов. Во время программирования вы храните исходный код в текстовых файлах с разными расширениями, например, файлы программирования на C заканчиваются расширением.c, Файлы программирования Java с .java, и файлы Python с .py.
Файловый ввод / вывод
Обычно вы создаете файлы с помощью текстовых редакторов, таких как блокнот, MS Word, MS Excel или MS Powerpoint и т. Д. Однако во многих случаях нам также необходимо создавать файлы с помощью компьютерных программ. Мы можем изменить существующий файл с помощью компьютерной программы.
Файловый ввод означает данные, которые записываются в файл, а файловый вывод означает данные, которые читаются из файла. Фактически, термины ввода и вывода больше связаны с вводом и выводом экрана. Когда мы отображаем результат на экране, он называется выводом. Точно так же, если мы предоставляем некоторый ввод в нашу программу из командной строки, это называется вводом.
На данный момент достаточно помнить, что запись в файл - это ввод файла, а чтение чего-либо из файла - вывод файла.
Режимы работы с файлами
Прежде чем мы начнем работать с каким-либо файлом с помощью компьютерной программы, нам нужно либо создать новый файл, если он не существует, либо открыть уже существующий файл. В любом случае мы можем открыть файл в следующих режимах -
Read-Only Mode- Если вы собираетесь просто прочитать существующий файл и не хотите записывать в него какое-либо дополнительное содержимое, вы откроете файл в режиме только для чтения. Почти все языки программирования предоставляют синтаксис для открытия файлов в режиме только для чтения.
Write-Only Mode- Если вы собираетесь производить запись либо в существующий файл, либо во вновь созданный файл, но не хотите читать какой-либо записанный контент из этого файла, вы откроете файл в режиме только для записи. Все языки программирования предоставляют синтаксис для открытия файлов в режиме только для записи.
Read & Write Mode - Если вы собираетесь читать и записывать в один и тот же файл, то вы откроете файл в режиме чтения и записи.
Append Mode- Когда вы открываете файл для записи, это позволяет вам начать запись с начала файла; однако он перезапишет существующий контент, если таковой имеется. Предположим, мы не хотим перезаписывать существующее содержимое, тогда мы открываем файл в режиме добавления. Режим добавления - это, в конечном счете, режим записи, который позволяет добавлять содержимое в конец файла. Почти все языки программирования предоставляют синтаксис для открытия файлов в режиме добавления.
В следующих разделах мы узнаем, как открыть новый файл, как писать в него, а позже, как читать и добавлять больше содержимого в тот же файл.
Открытие файлов
Вы можете использовать fopen()функция для создания нового файла или открытия существующего файла. Этот вызов инициализирует объект типаFILE, который содержит всю информацию, необходимую для управления потоком. Вот прототип, то есть подпись этого вызова функции -
FILE *fopen( const char * filename, const char * mode );
Вот, filename является строковым литералом, который вы будете использовать для имени файла и доступа mode может иметь одно из следующих значений -
Старший Нет | Режим и описание |
---|---|
1 |
r Открывает существующий текстовый файл для чтения. |
2 |
w Открывает текстовый файл для записи. Если его нет, создается новый файл. Здесь ваша программа начнет писать контент с начала файла. |
3 |
a Открывает текстовый файл для записи в режиме добавления. Если его нет, создается новый файл. Здесь ваша программа начнет добавлять содержимое в существующее содержимое файла. |
4 | r+ Открывает текстовый файл для чтения и записи. |
5 |
w+ Открывает текстовый файл для чтения и записи. Сначала он обрезает файл до нулевой длины, если он существует; в противном случае создает файл, если он не существует. |
6 |
a+ Открывает текстовый файл для чтения и записи. Создает файл, если он не существует. Чтение начнется сначала, но запись может быть только добавлена. |
Закрытие файла
Чтобы закрыть файл, используйте 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, добавив 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() метод читает Thisпотому что после этого он обнаружил пробел. Второй призыв к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()
Когда приведенный выше код выполняется, он дает следующий результат:
This is testing for Python write...
This is second line...