ПОЗНАВАТЕЛЬНОЕ Сила воли ведет к действию, а позитивные действия формируют позитивное отношение Как определить диапазон голоса - ваш вокал
Игровые автоматы с быстрым выводом Как цель узнает о ваших желаниях прежде, чем вы начнете действовать. Как компании прогнозируют привычки и манипулируют ими Целительная привычка Как самому избавиться от обидчивости Противоречивые взгляды на качества, присущие мужчинам Тренинг уверенности в себе Вкуснейший "Салат из свеклы с чесноком" Натюрморт и его изобразительные возможности Применение, как принимать мумие? Мумие для волос, лица, при переломах, при кровотечении и т.д. Как научиться брать на себя ответственность Зачем нужны границы в отношениях с детьми? Световозвращающие элементы на детской одежде Как победить свой возраст? Восемь уникальных способов, которые помогут достичь долголетия Как слышать голос Бога Классификация ожирения по ИМТ (ВОЗ) Глава 3. Завет мужчины с женщиной 
Оси и плоскости тела человека - Тело человека состоит из определенных топографических частей и участков, в которых расположены органы, мышцы, сосуды, нервы и т.д. Отёска стен и прирубка косяков - Когда на доме не достаёт окон и дверей, красивое высокое крыльцо ещё только в воображении, приходится подниматься с улицы в дом по трапу. Дифференциальные уравнения второго порядка (модель рынка с прогнозируемыми ценами) - В простых моделях рынка спрос и предложение обычно полагают зависящими только от текущей цены на товар. | Пример 17.8. Использование функций fseek() и ftell().-Работает #include <stdio.h> #include <iostream.h> #include <conio.h> int main() { FILE* fp = fopen("prim17-8.txt","w"); if(fp != NULL) { fprintf(fp,"It is an example using fseek and ftell functions."); } fclose(fp); fp = fopen("prim17-8.txt","r"); if(fp != NULL) { char ch; fseek(fp,0L,SEEK_END); long length = ftell(fp); printf("length = %ld\n",length); for(int i = 1;i <= length;i++) { fseek(fp,-i,SEEK_END); ch = getc(fp); putchar(ch); } } fclose(fp); cout << "\nНажмите любую клавишу..." ; getch(); return 0; } В данном примере сначала создается файл, в который записывается строка "It is an example using fseek and ftell functions.". Затем этот файл открывается на чтение и с помощью функции fseek(fp,0L,SEEK_END) указатель позиции помещается в конец файла. Это достигается за счет установки флага SEEK_END, который перемещает позицию в конец файла при нулевом смещении. В результате функция ftell(fp) возвратит число символов в открытом файле. В цикле функция fseek(fp,-i,SEEK_END) смещает указатель позиции на -i символов относительно конца файла, после чего считывается символ функцией getc(), стоящий на i-й позиции с конца. Так как переменная i пробегает значения от 1 до length, то на экран будут выведены символы из файла в обратном порядке.  2. Файловый ввод-вывод. Двоичные файлы 2.1. Двоичные файлы Текстовые файлы не являются единственно возможным способом хранения информации на диске. Можно запоминать информацию и в двоичном виде. Принципиально обработка двоичных файлов не очень сильно отличается от обработки текстовых файлов. В любом случае, прежде чем работать с файлом, следует связать его физическое имя с логическим именем (с файловым потоком) и открыть файл, указав режим доступа. После работы с файлом его необходимо закрыть. Тем не менее, отличия обработки двоичных файлов и текстовых все же существуют. Рассмотрим их. Следует отметить, что во всех рассмотренных выше примерах функция fopen() в режимах "r" и "w" открывает текстовый файл на чтение и запись соответственно. Это означает, что некоторые символы форматирования текста, например возврат каретки '\r' не могут быть считаны как отдельные символы, их как бы не существует в файле, но при этом они там есть. Это особенность текстового режима файла. Для более «тонкой» работы с содержимом файлов существует бинарный режим, который представляет содержимое файла как последовательность байтов где все возможные управляющие коды являются просто числами. Именно в этом режиме возможно удаление или добавление управляющих символов недоступных в текстовом режиме. Для того чтобы открыть файл в бинарном режиме используется также функция fopen() с последним параметром равным "rb" и "wb" соответственно для чтения и записи. Продемонстрируем особенности обработки бинарного файла на примере подсчета числа управляющих символов возврата каретки '\r' в файле, открытый в текстовом режиме и бинарном. Открыть файл для двоичной обработки можно посредством вызова функции fopen(), но ко всем режимам доступа добавляют строчную латинскую букву b. Режимы доступа одинаковы для текстовых и для двоичных файлов. FILE *fb = fopen ( "Bin_fil.dat","wb"); откроет файл для записи в двоичном режиме. А чтобы открыть его для чтения и записи следует написать: FILE *fb = fopen ( "Bin_fil.dat","r+b"); Если после вызова функции fopen() указатель на файловый поток fb не равен 0, его можно использовать в последующих обращениях к функциям работы с двоичными файлами, таким как fread() и fwrite(). Закрывают двоичные файлы, как и текстовые, функцией fclose(). Не следует использовать функции обработки текстовых файлов применительно к двоичным файлам и наоборот. Пример 17.9. Программа подсчета числа символов '\r' в файле.-Работает #include <stdio.h> #include <iostream.h> #include <conio.h> int main() { FILE* fp = fopen("prim17-9.txt","w"); if(fp != NULL) { fprintf(fp,"It is\nan example using\nan binary file."); } fclose(fp); char ch; int cnt = 0; fp = fopen("prim17-9.txt","r"); if(fp != NULL) { while((ch = getc(fp)) != EOF) if(ch == '\r') cnt++; } fclose(fp); printf("Text file: cnt = %d\n",cnt); cnt=0; fp = fopen("prim17-9.txt","rb"); if(fp != NULL) { while((ch = getc(fp)) != EOF) if(ch == '\r') cnt++; } fclose(fp); printf("Binary file: cnt = %d\n",cnt); cout << "\nНажмите любую клавишу..." ; getch(); return 0; }  Результат работы будет следующий: Text file: cnt = 0 Binary file: cnt = 2 Анализ полученных данных показывает, что при открытии файла в текстовом режиме, символы возврата каретки '\r' не считываются функцией getc(), а в бинарном режиме доступны все символы. Еще одной особенностью текстового формата файла является запись чисел в виде текста. Действительно, когда в предыдущих примерах выполнялась запись числа в файл с помощью функции fprintf(), например, года издательства книги, то число заменялось строкой. А когда она считывалась функцией fscanf(), то преобразовывалась обратно в число. Если мы хотим компактно представлять данные в файле, то числа следует хранить как числа, а не как строки. При этом целесообразно использовать бинарный режим доступа к файлу, т. к. будет гарантия, что любое записанное число не будет восприниматься как управляющий символ и будет корректно считан из файла. Для работы с бинарными файлами предусмотрены функции fread() и fwrite() со следующим синтаксисом: size_t fread( void *buffer, size_t size, size_t count, FILE *stream ); где *buffer - указатель на буфер памяти, в который будут считываться данные из файла; size - размер элемента в байтах; count - число считываний элементов; *stream - указатель на файл. size_t fwrite( void *buffer, size_t size, size_t count, FILE *stream ); где *buffer - указатель на буфер памяти, из которого будут считываться данные в файл; size - размер элемента в байтах; count - число записей; *stream -указатель на файл. Приведем пример использования функций fwrite() и fread(). |