Пример использования потоков

Основные используемые функции

Копировать
unsigned short chunk_id;	//Идентификатор блока
unsigned int chunk_len;		//Смещение 

//Переменная типа файловый поток чтения, где ifs просто имя переменной
ifstream ifs;

//Открыть файл с именем fname, как бинарный для чтения и поставить файловый указатель в начало
ifs.open(fname.c_str(), ios_base::in | ios_base::binary | ios_base::beg);

ifs.fail();	//Файл открыт?

//Считать в переменную  chunk_id 2 байта;
//причем часть кода "(char*)&" является обязательной и преобразует адрес переменной в указатель на символ
ifs.read((char*)&chunk_id,2);

//Пропустить chunk_len-6 байт; перейти на  chunk_len-6 байт вперед
ifs.ignore(chunk_len-6);

//Поставить файловый указатель на позицию ifs.tellg()-6
ifs.seekg(ifs.tellg()-6);

//Получить текущую позицию файлового указателя
ifs.tellg();

//Конец файла?
ifs.eof();

Примечание. Вместо методов read и write можно использовать перегруженные операторы ">>" и "<<" соответственно

Пример кода

Следующий код производить поиск и заменну в заданом файле. Результаты записываються в новый файл.

Копировать
#include <cstdlib>
#include <iostream>
#include <fstream>
using namespace std;


int main(int argc, char *argv[])
{

	char buffer[1];
	int i;
	long currentpos;	/*переменная хранящая позицию внутри потока 
				(также можно использовать тип streampos
				(или pos_type в комиляторах которые поддерживают ANSI C++))*/
	bool match = false;

	if (argc != 5) {
		cout << "Usage: filter [search string] [replace string] [infile] [outfile]" << endl;
		return 1;
	}

	string searchstring = argv[1];
	string replacestring = argv[2];
	string infilename = argv[3];
	string outfilename = argv[4];

	//создаём поток для ввода(чтения из файла)
	ifstream input(infilename.c_str(), ios::in);
	if (input.fail()) {
		cout << "Unable to open input file!" << endl;
		return 1;
	}

	//создаём поток для вывода(записи в файл)
	ofstream output(outfilename.c_str(), ios::out | ios::trunc);
	if (output.fail()) {
		cout << "Unable to open output file!" << endl;
		return 1;
	}

	while (!input.eof()) {
		currentpos = input.tellg();		//сохранение указателя на позицию в файле
		input.read(buffer, sizeof(buffer));	//можно использовать операцию ">>"
		if (buffer[0] == searchstring[0]) {		
			match = true;
			i = 1;
			while (i < searchstring.length() && match) {
				input.read(buffer, sizeof(buffer));
				if (buffer[0] != searchstring[i]) {
					input.seekg(currentpos);	//установка указателя 
									//на позицию в файле
					input.read(buffer, sizeof(buffer));
					match = false;
				}
	        		else
					i++;
			}
		}
		if (match) {
			output.write(replacestring.c_str(), replacestring.length());
			match = false;
		}
		else
			output.write(buffer, sizeof(buffer));	//можно использовать операцию "<<"
	}
	input.close();
	output.close();
	ifstream display(outfilename.c_str(), ios::in);

	//вывод результатов
	while (!display.eof()) {
		display.read(buffer, sizeof(buffer));
		if (display.good())
			cout << buffer[0];
	}
	display.close();
	return 0;
}

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


Тонировка балконов
stekloestetika.ru