Пример использования потоков
Основные используемые функции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;
}
При чтении текстовых файлов с использованием оператора >> имейте в виду, что могут происходить преобразования некоторых символов. Например, пробельные символы опускаются. Чтобы не допустить ненужного преобразования символов, необходимо открыть файл для двоичных операций ввода-вывода и использовать двоичные функции ввода-вывода. |