Текстовые (строковые) файлы




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

Текстовые файлы относятся к файлам последовательного доступа, т.к. единицей хранения информации в них являются строки переменной длины. Каждая строка заканчивается специальным признаком, обычно его функцию выполняет пара символов 0D0A – "возврат каретки" и "перевод строки". Самым важным преимуществом текстовых файлов является универсальность формата хранения информации – числовые данные в символьном виде доступны на любом компьютере, при необходимости их может прочитать и человек. Однако это преимущество имеет и обратную сторону медали – преобразование числовых данных из машинных форматов в символьный вид при выводе и обратное преобразование при вводе сопряжено с дополнительными расходами. Кроме того, объем числовых данных в символьном формате занимает в несколько раз больше памяти по сравнению с их машинным представлением.

Текстовый файл может быть создан путем записи на диск символьных и/или числовых данных по заданному формату с помощью оператора fprintf. В качестве признака конца строки здесь заносятся те же самые байты 0D0A, которые появляются на диске в результате вывода управляющего символа \n.

Для инициализации текстового файла необходимо завести указатель на структуру типа FILE и открыть файл по оператору fopen в одном из нужных режимов – "rt" (текстовый для чтения), "wt" (текстовый для записи), "at" (текстовый для дозаписи в уже существующий набор данных):

FILE *f1;......... f1=fopen(имя_файла, "режим");

Формат оператора обмена с текстовыми файлами мало чем отличается от операторов форматного ввода (scanf) и вывода (printf). Вместо них при работе с файлами используются функции fscanf и fprintf, у которых единственным дополнительным аргументом является указатель на соответствующий файл:

fscanf(f1,"список_форматов", список_ввода); fprintf(f1,"список_форматов \n",список_вывода);

Если очередная строка текстового файла формируется из значения элементов символьного массива str, то вместо функции fprintf проще воспользоваться функцией fputs(f1, str). Чтение полной строки из текстового файла удобнее выполнить с помощью функции fgets(str,n,f1). Здесь параметр n означает максимальное количество считываемых символов, если раньше не встретится управляющий байт 0A.

Библиотека C предусматривает и другие возможности для работы с текстовыми файлами – функции open, create, read, write.

Пример. Рассмотрим программу, которая создает в текущем каталоге (т.е. в каталоге, где находится наша программа) текстовый файл с именем mass и записывает в него значения, введенные с клавиатуры (10 значений). Для контроля содержимое записываемых строк и содержимое считанных строк дублируется на экране.

#include <iostream>

#include <stdio.h>

#include <stdlib.h>

#include <math.h>

#include <conio.h>

using namespace std;

 

 

int main()

{

FILE *Ptr;

if((Ptr=fopen("mass.txt","wt"))=NULL){

cout<<"File could not be opened."<<endl;

}

else{

int value;

FILE *Ptr;

 

Ptr=fopen("mass.txt","w");

printf("Enter value: \n");

scanf("%d",&value);

 

for(int i=0;i<10;i++){

fprintf(Ptr,"%d",value);

scanf("%d",&value);

}

 

fclose(Ptr);

} //конец else

}

Двоичные файлы

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

Создание двоичных файлов с помощью функции fopen отличается от создания текстовых файлов только указанием режима обмена – "rb" (двоичный для чтения), "rb+" (двоичный для чтения и записи), "wb" (двоичный для записи), "wb+" (двоичный для записи и чтения):

FILE *f1;......... f1=fopen(имя_файла, "режим");

Обычно для обмена с двоичными файлами используются функции fread и fwrite:

c_w = fwrite(buf, size_rec, n_rec, f1);

Здесь

  • buf – указатель типа void* на начало буфера в оперативной памяти, из которого информация переписывается в файл;
  • size_rec – размер передаваемой порции в байтах;
  • n_rec – количество порций, которое должно быть записано в файл;
  • f1 – указатель на блок управления файлом;
  • c_w – количество порций, которое фактически записалось в файл.

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

c_r = fread(buf, size_rec, n_rec, f1);

Здесь

  • c_r – количество порций, которое фактически прочиталось из файла;
  • buf – указатель типа void* на начало буфера в оперативной памяти, в который информация считывается из файла.

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

fseek(f1,delta,pos);

Здесь

  • f1 – указатель на блок управления файлом;
  • delta – величина смещения в байтах, на которую следует переместить указатель файла;
  • pos – позиция, от которой производится смещение указателя (0 или SEEK_SET – от начала файла, 1 или SEEK_CUR – от текущей позиции, 2 или SEEK_END – от конца файла)


Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-12-07 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: