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