Форум программистов, компьютерный форум CyberForum.ru

Удаление строки из файла через сдвиги. - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Вычислить сумму первых N слагаемых: 2/1+2/3+4/3+4/5+6/5+6/7 http://www.cyberforum.ru/cpp-beginners/thread314295.html
Вычислить сумму первых N слагаемых: 2/1+2/3+4/3+4/5+6/5+6/7... ребят подскажите как правильно? код #include <iostream> using namespace std; int main()
C++ Написать алгоритм и блок-схему и программу на С++ Даны два действительные числа.Вывести первое число,если оно больше второго,и оба числа если это не так. http://www.cyberforum.ru/cpp-beginners/thread314290.html
Написать алгоритм и блок-схему и программу на С++ C++
Составить программу вычисления времени падения тела с данной высоты. плизз++
Контейнер из неоднородных элементов C++
Хотел сначала написать в раздел С для экспертов, но выяснилось- прав не имею. Есть такая задача (даже несколько разновидностей) дается в Бауманке на 1 или 2 курсе: Моделировать очередь (руками), в качестве элементов которой могут использоваться числа и слова. Операции: добавление элемента, удаление элемента, печать элементов. Соз-дать класс - потомок, который содержит процедуру сортировки слов...
C++ wxDev, не работает inp и outp http://www.cyberforum.ru/cpp-beginners/thread314282.html
Подскажите пожалуйста, какую библиотеку в wxDev используют функции inp и outp для работы с портами? conio.h и dos.h не помагают. Пишет: undefined reference to `outp' undefined reference to `inp' Добавлено через 1 час 12 минут подозреваю что этих функций нет, тк это работает только под дос. :( Следовательно, вопрос: а можно ли под win7 работать с портами, в частности...
C++ Битовое представление Здравствуйте! Напишите пример функции, которая принимает целое число и выводит его битовое представление . int Bit_Representation (int int_number) Спасибо! подробнее

Показать сообщение отдельно
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
07.06.2011, 23:21     Удаление строки из файла через сдвиги.
Вот инфа.

Произвольный доступ
Как уже отмечалось, С++ позволяет выполнять позиционирование в любых потоках, кроме стандартных. Методы позиционирования приведены в табл. 14.5. Методы позиционирования различаются для входных и выходных потоков: для входных потоков (см. п.п. 27.6.1.3 в [1]) имена методов заканчиваются символом «g» (от слова get), для выходных (см. п.п. 27.6.2.4 в [1]) — символом «p» (от слова put).

Таблица 14.5. Методы позиционирования
Метод Описание
C++
1
2
3
4
5
6
pos_type tellg()    Получить текущую (абсолютную) позицию чтения
istream& seekg (pos_type p) Установить абсолютную позицию чтения
istream& seekg (off_type p, ios::seekdir s) Установить относительную позицию чтения
pos_type tellp()    Получить текущую (абсолютную) позицию записи
istream& seekp (pos_type p) Установить абсолютную позицию записи
istream& seekp (off_type p, ios::seekdir s) Установить относительную позицию записи
Функции tellp() и tellg() возвращают абсолютное смещение от начала потока. Символы потока нумеруются, как и индексы массива, начиная с нуля. Однако тип pos_type не является целым типом. Поэтому получать текущую позицию чтения в файловом потоке нужно так:
C++
1
ios::pos_type p = file.tellg();
Можно сохранить текущую позицию и в переменной типа streampos, например:
C++
1
streampos pos = file.tellp();
Переход к позиции, сохраненной в переменной pos, делается так:
C++
1
file.seekp(pos);
Несмотря на то, что тип значения позиции в потоке не является целым значением, целые константы можно использовать в качестве аргумента в методах установки позиции — выполняется преобразование по умолчанию. Символы в потоке нумеруются, начиная с нулевого, поэтому позиционирование в начало потока можно выполнить, например, так:
C++
1
file.seekg(0);
После этого опять можно будет прочитать первый символ потока.
Методы установки относительной позиции очень похожи на функцию fseek() из библиотеки <cstdio>. В классе ios_base определены следующие константы (см. п.п. 27.4.2.1.5 в [1]):
C++
1
2
3
static const seekdir beg,    // позиционирование от начала потока 
                     cur,    // позиционирование от текущей позиции
                     end;    // позиционирование от конца потока
Первый аргумент, который обычно задается целым числом (выполняется преобразование по умолчанию), является смещением (в символах) от указанной позиции. Положительное число означает смещение вперед — ближе к концу файла, отрицательное — смещение назад, к началу файла. Например, позиционироваться в конец файла можно так:
C++
1
file.seekg(0, ios::end);
При позиционировании нужно следить, чтобы позиция оставалась внутри файла. Попытка позиционироваться до начала потока или после конца приводит поток в состояние bad(). Небольшой пример показывает, как работает относительное позиционирование (листинг 14.22).
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Листинг 14.22. Относительное позиционирование
int main()
{   fstream strm("c:/binfiles/oonumber2.bin",ios::binary|ios::in|ios::out);
    int a = 0;
    // читаем числа из файла и выводим 
    strm.seekg(2*sizeof(int), ios::beg);      // выставляемся от начала
    strm.read((char *)&a, sizeof(int));       // читаем
    cout << a << ' ' << '\n';
    // записываем новое число на ту же позицию
    a = 12021;
    strm.seekp(2*sizeof(int), ios::beg);      // выставляемся от начала
    strm.write((char *)&a, sizeof(int));      // записываем
    // возвращаемся, читаем снова и выводим
    strm.seekg(2*sizeof(int), ios::beg);      // выставляемся от начала
    strm.read((char *)&a, sizeof(int));       // опять читаем
    cout << a << ' ' << '\n';
    return EXIT_SUCCESS;
}
В примере открывается существующий (см. листинг 14.7) двоичный файл в режиме чтения/записи. Оба флага (ios::in|ios::out) задавать обязательно, иначе по умолчанию файловый поток открывается только для записи. Сначала читается третье от начала число, затем выполняется возврат в ту же позицию и записывается новое число. Результат можно наблюдать на экране.
C помощью методов позиционирования можно вычислить размер файла (листинг 14.23).
C++
1
2
3
4
5
6
7
8
Листинг 14.23. Функция, вычисляющая длину файла
long filesize(ifstream &stream)
{  streampos curpos = stream.tellg();    // сохраняем текущую позицию
   stream.seekg(0, ios::end);            // высталяемся на конец файла
   streampos last = stream.tellg();      // получаем позицию = длина
   stream.seekg(curpos);                 // возвращаем текущую позицию.
   return last;
}
Несмотря на то, что используются переменные типа streampos, в результате выполняется преобразование по умолчанию в тип long. Применять эту функцию можно как с двоичными файлами, так и с текстовыми, например:
C++
1
2
3
4
5
6
7
ifstream g;
g.open("c:/textfiles/result.files");
cout << filesize(g) << endl;
g.close();
g.open("c:/binfiles/bin2.bin", ios::binary);
cout << filesize(g) << endl;
g.close();
Сначала вычисляется длина текстового файла result.files, который образовался в каталоге textfiles в результате вызова функции includeFile() (см. листинг 14.5). Затем с помощью той же функции вычисляется длина двоичного файла из листинга 14.8.

Методы позиционирования облегчают обработку двоичных файлов, записанных любыми другими средствами, например, средствами языка Pascal. В С++, в отличие от языка программирования Pascal, отсутствуют типизированные файлы с записями (file of type). В языке Pascal такие файлы являются двоичными. Записи нумеруются, начиная с нуля, что обеспечивает прямой доступ к записи. Такие файлы в программе на языке Pascal по умолчанию открываются в режиме чтения/записи.
Мы вполне можем обработать такие файлы и обеспечить прямой доступ к записям по номерам средствами С++. Для этого нужно объявить в программе структуру, имеющую поля соответствующих типов, заданные в том же порядке, что в записи в программе на Pascale. Здесь нужно внимательно отнестись к проблеме выравнивания — структура в С++ должна иметь точно такой же размер, как и запись в Pascal. Далее нужно открыть файл как двоичный в режиме чтения/записи. Чтение из файла выполняется оператором
C++
1
strm.read((char *)&record, sizeof(T));
А запись выполняется оператором
C++
1
strm.write((char *)&record, sizeof(T));
Здесь sizeof(T) — размер структуры в С++, который должен совпадать с размером записи в Pascal.
Методы относительного позиционирования позволяют реализовать прямой доступ к записям этого двоичного файла. Например, позиционирование на k-ю запись для чтения выполняется оператором
C++
1
strm.seekg(k*sizeof(T), beg);
Если необходимо сместиться вперед от текущей позиции на одну запись вперед, можно воспользоваться любой из следующих инструкций:
C++
1
2
3
// эквивалентные вызовы seekg
stream.seekg(stream.tellg() + sizeof(T));     // абсолютная позиция
stream.seekg(sizeof(T), ios::cur);            // относительная позиция
Сместиться назад на одну запись можно так:
C++
1
2
stream.seekg(stream.tellg() - sizeof(T));     // абсолютная позиция
stream.seekg(-sizeof(T), ios::cur);           // относительная позиция
 
Текущее время: 00:53. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru