Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Praktikum_programmirovanie.doc
Скачиваний:
30
Добавлен:
30.03.2015
Размер:
15.88 Mб
Скачать

Определение конца файла

Обычной файловой операцией в ваших программах является чтение содержимого файла, пока не встретится конец файла. Чтобы определить конец файла, ваши программы могут использовать функцию еоf потокового объекта. Эта функция возвращает значение 0, если конец файла еще не встретился, и 1, если встретился конец файла. Используя цикл while,ваши программы могут непрерывно читать содержимое файла, пока не найдут конец файла, как показано ниже:

while (! input_file.eof())

{    // Операторы  }

В данном случае программа будет продолжать выполнять цикл, пока функция eof возвращает ложь (0). Следующая программа использует функцию eof для чтения содержимого файла file.txt, пока не достигнет конца файла:

#include <iostream.h>

#include <conio.h>

#include <fstream.h>

int main()

{

ifstream rf("D://file.txt") ;

char line[64];

while (! rf.eof())

{

rf.getline(line, sizeof(line));

cout << line << endl;

}

getch();

}

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

#include <iostream.h>

#include <conio.h>

#include <fstream.h>

int main()

{

ifstream rf("D://file.txt") ;

char word[64] ;

while (! rf.eof())

{

rf >> word;

cout << word << endl;

}

getch();

}

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

#include <iostream.h>

#include <conio.h>

#include <fstream.h>

int main()

{

ifstream rf("D://file.txt") ;

char letter;

while (! rf.eof())

{

letter = rf.get();

cout << letter<<'\n';

}

getch();

}

Закрытие файла, если он больше не нужен

При завершении вашей программы операционная система закроет открытые ею файлы. Однако, как правило, если вашей программе файл больше не нужен, она должна его закрыть. Для закрытия файла ваша программа должна использовать функцию close, как показано ниже:

input_file.close ();

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

Ввод/вывод данных с помощью функций унаследованных от с

Поток в C++ - последовательность байтов, независимых от конкретного устройства, с которого производится считывание данных.

Открытие потока

Работа с потоком начинается с его открытия. Поток можно открыть для чтения и/или записи в двоичном или текстовом режиме. Функция открытия потока имеет формат:

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

FILE – специальный тип данных, содержащий информацию необходимую для выполнения операций с файлом.

Первый параметр — имя открываемого файла в виде строки, второй — режим открытия файла:

"г" — файл открывается для чтения;

"w" — открывается пустой файл для записи (если файл существует, он стирается);

"а" — файл открывается для добавления информации в его конец;

"г+" — файл открывается для чтения и записи (файл должен существовать);

"W+ " — открывается пустой файл для чтения и записи (если файл существует, он стирается);

"а+" — файл открывается для чтения и добавления информации в его конец.

Режим открытия может также содержать символы t (текстовый режим) или b (двоичный режим), отличающиеся обработкой символов перехода на новую строку. По умолчанию файл открывается в текстовом режиме. Текстовый файл трактуется в С++ как совокупность символьных строк переменной длины. Доступ к каждой строке возможен лишь последовательно, начиная с первой. При создании текстовых файлов в конце каждой строки ставится специальный признак EOL (кодируется последовательностью кодов 13 и 10), а в конце всего файла – признак конца файла (код 26).

В двоичном режиме эти преобразования не выполняются.

Пример:

FILE * f = fopen("d:\\cpp\\clata". "rb+");

Имя функции является указателем на ее расположение в памяти, поэтому знак равенства допустим. Присваивание указателю адреса функции fopen необходимо для того, чтобы ее можно было использовать в других функциях (методах).

Указатель f используется в дальнейших операциях с потоком. Его передают функциям ввода/вывода в качестве параметра. При открытии потока с ним связывается область памяти, называемая буфером. Это делается для увеличения скорости передачи данных.

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

Ввод/вывод в поток

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

Операции ввода/вывода выполняются начиная с текущей позиции потока, определяемой положением указателя потока. Указатель устанавливается при открытии на начало или конец файла (в соответствии с режимом открытия) и изменяется автоматически после каждой операции, ввода/вывода. Текущее положение указателя можно получить с помощью функций ftel1 и fgetpos и задать явным образом с помощью функций fseek и fsetpos. Эти функции нельзя использовать для стандартных потоков (stdin - стандартный поток ввода данных, stdout - стандартный поток вывода данных и stderr - стандартный поток ошибок).

• Чтение и запись потока байтов выполняют функции fread и fwrite.

• Чтение символа из потока — getc, fgetc, из стандартного потока stdin — getchar.

• Запись символа в поток — put с, fputc, в стандартный поток stdout — putchar.

• Чтение строки из потока — fgets, из стандартного потока stdin — gets.

• Запись строки в поток — fputs, в стандартный поток stdout — puts.

• Форматированный ввод из потока — fscanf, из стандартного потока stdin —scanf, из строки — sscanf.

• Форматированный вывод в поток — fprintf, в стандартный поток stdout —printf, в строку — sprintf.

Закрытие потока

Поток закрывается либо при завершении программы, либо явным образом с помощью функции fclose:

int fclose(FILE*):

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

Обработка ошибок

Функции работы с потоком возвращают значения, которые рекомендуется анализировать в программе и обрабатывать ошибочные ситуации, возникающие, например, при открытии существующих файлов или чтении из потока. При работе с файлами часто используются функции feof и terror:

int feof (FILE*) возвращает не равное нулю значение, если достигнут конец файла, в противном случае 0;

int terror (FILE*) возвращает не равное нулю значение, если обнаружена ошибка ввода/вывода, в противном случае 0.

Примеры чтения строк и символов из файла

Пример 1.

#include<iostream.h>

#include<stdio.h>

int main()

{

FILE *f=fopen("d:\\data.txt","r"); открываем файл в режиме чтения (“r”)

char c;

int i=0;

while (!feof(f)) пока не конец файла

{i++; увеличиваем i на 1

c=fgetc(f); считываем очередной символ

cout<<c<<'\n';} выводим построчно считанные символы

cout<<i; выводим общее количество символов

}

Пример 2.

#include<iostream.h>

#include<stdio.h>

int main()

{

FILE *f=fopen("d:\\data.txt","r");

char s[150]; int i=0;

while(fgets(s,150,f)) Пока не закончатся строки

{i++; увеличиваем i на 1

cout<<s<<'\n';} выводим считанную строку

cout<<i; выводим количество строк

}

Помним, что символ перевода на новую строку также считывается и учитывается в общем количестве.

Пример чтения чисел из файла

#include <stdlib.h>

#include <iostream.h>

#include <conio.h>

int main()

{

FILE *file; // файловый указатель

int v[20][10]; // итоговый массив

// читаем данные из файла в массив v[][]

file = fopen( "file.txt", "r" ); // открываем файл для чтения

for (int i = 0; i < 20; i++) // цикл по строкам массива

{

for (int j = 0; j < 10; j++) // цикл по столбцам

{

fscanf( file, "%d", &v[i][j]); // читаем очередное число из файла

printf( "%d ", v[i][j]); // пишем считанное число на экран

}

printf( "\n" ); // переводим строку

}

fclose(file); // закрываем файл

getch();

}

Запись в файл

#include<iostream.h>

int main()

{

FILE *f=fopen("D:\\writefile.txt","w");

for (int i=1;i<=10;i++)

{

fprintf(f,"%d",i);

fprintf( f, "\n" );

}

fclose(f);

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]