Шаг 92.
Microsoft Visual C++ 2010. Язык С/С++.
Ввод и вывод в языках C и C++. Ввод/вывод в языке C++. Работа с классом ifstream

    На этом шаге мы перечислим основные методы работы с этим классом и приведем пример использования классов ввода/вывода.

    Этот класс предназначен для организации работ по вводу (чтению) из файла помощью методов этого класса:

Ниже приведен пример использования этого класса.
#include <fstream>
.   .   .   .
ifstream FILE; //объявляем переменную FILE типа 
                      //ifstream (создаем экземпляр класса)
FILE.open ("а.txt");  //вызываем метод открытия файла
if ( FILE == NULL ) return 0;  //неудачное открытие файла
.   .   .   .
while(!FILE.eof())	//проверка на признак конца файла
{
  FILE >> p;           //чтение из файла
  cout >> р >> endl;   //вывод прочитанных данных на экран
}
.   .   .   .
FILE.close () ; //закрытие файла

    Ниже приведен пример использования этих классов: ofstream и ifstream (оба находятся в fstream), результат работы программы показан на рисунке 1.

// 92_1.cpp: главный файл проекта.

#include "stdafx.h"
#include <iostream>
#include <fstream>  
#include <conio.h>

#include <clocale>     //обязательно для функции setlocale()

#define DelKey 'о'   //этот символ будет удаляться из потока  
#define MAXLINE 1000

using namespace std;    // используется стандартное пространство имен
using namespace System;

void main()
{
	setlocale(LC_ALL,"Russian"); //функция setlocale() с аргументами
	                             //для корректного вывода кириллицы
	//Проверка вывода
	ofstream FILE;
	FILE.open ("I:\\a.txt", ios::out);
	char p[MAXLINE];
	int i;
        streampos p; //для хранения позиции файлового указателя
	for(i=0; i<2; i++)
		FILE << "Строка " << i; //<< endl;  
	    //endl вводить не надо, иначе и выводить его надо и цикл будет длиннее
	FILE.close();

	//Проверка ввода (чтения по записям)
	ifstream FILE1; 
	FILE1.open ("I:\\a.txt");
	if (FILE1 == NULL)   //так надо проверять на ошибку открытия файла 
		return;
	while (!FILE1.eof())   //так проверяется конец файла
	{
		FILE1 >> p >> i;
		cout << p << i << endl;
	}
	FILE1.close();
	_getch();

	//Проверка посимвольного чтения
	ifstream FILE2;
	char c;
	FILE2.open("I:\\a.txt");
	if(FILE2 == NULL)   //так проверять на плохое открытие
		return; 
	while(!FILE2.eof()) //так проверяется конец файла
	{
		c=FILE2.peek(); //смотрит, какой следующий символ будет считан,
	                    //но указатель позиционирования при этом не сдвигается: 
	                    //остается на этом символе
		streamoff cgp=FILE2.tellg(); //определяется текущая позиция в файле

		if(c == DelKey) //выбрасываются все символы DelKey из читаемого потока
		{
			pos = cgp + 1; // готовимся пропустить символ по seekg()
			//передвинули указатель позиционирования один символ дальше, 
			//чтобы пропустить символ
			FILE2.seekg(pos);
			continue;   //на продолжение цикла
		}
		FILE2.get(c);  //чтение символа в с 
		if (c != EOF)
			cout << c; 
	} //while 
	cout << endl; 
	FILE2.close(); 
	_getch();
	system("DEL I:\\a.txt");  // удаление рабочего файла
}
Архив проекта можно взять здесь.


Рис.1. Результат работы приложения

    Обратите внимание на типы streampos и streamoff. Оба этих типа определены в заголовочном файле iostream и используются для для определения переменныx, содержащих номера позиций файлового указателя. Тип streamoff чаще применяется для задания смещения файлового указателя, а тип streampos - для определения позиции файлового указателя. Отметим, что объект типа streamoff способен содержать самое большое допустимое значение, которое может иметь смещение файлового указателя, а объект типа streampos - самое большое допустимое значение, которое может иметь позиция в файле файлового указателя. В настоящее время эти типы определены с помощью typedef как long.

    На следующем шаге мы рассмотрим работу с бинарным файлом.




Предыдущий шаг Содержание Следующий шаг