- •Раздел 4. Разработка по Тема 4.1. Проектирование интерфейса с пользователем
- •4.1.1. Типы пользовательских интерфейсов.
- •4.1.2. Пользовательская и программная модели интерфейса.
- •4.1.3. Разработка диалогов.
- •4.1.4. Основные компоненты графических пользовательских интерфейсов.
- •Тема 4.2. Реализация графических пользовательских интерфейсов.
- •4.2.1. Диалоги, управляемые пользователем.
- •4.2.2. Диалоги, управляемые системой.
- •4.2.3. Использование метафор.
- •4.2.4. Технология Drag and Drop.
- •4.2.5. Интеллектуальные элементы.
- •4.3.1. Базовые типы данных.
- •Константы
- •Область действия имен
- •4.3.2. Указатели и адресная арифметика.
- •4.3.3. Составные типы данных. Структуры
- •Битовые поля
- •Определение типов
- •Перечислимые типы
- •4.3.4. Выражения и операции.
- •4.3.5. Управляющие конструкции. Условные операторы
- •Операторы циклов
- •4.4.1. Статические одномерные массивы.
- •4.4.2. Статические многомерные массивы.
- •4.4.3. Динамические массивы.
- •4.4.4. Массивы указателей.
- •4.5.1. Стеки.
- •4.5.2. Очереди.
- •4.5.3. Списки.
- •4.5.4. Бинарные деревья.
- •4.6.1. Объявление классов и экземпляров классов.
- •4.6.2. Инкапсуляция данных и методов.
- •4.6.3. Конструкторы классов.
- •Конструктор по умолчанию
- •Конструктор копирования
- •4.6.4. Деструкторы классов.
- •4.7.1. Разделы в описании класса.
- •4.7.2. Friend-конструкции.
- •4.7.3. Статические члены классов.
- •4.7.4. Использование описателя const в классах.
- •4.8.1. Вложенность классов.
- •4.8.2. Наследование данных и методов.
- •4.8.3. Типы наследования.
- •4.9.1. Полиморфизм раннего связывания.
- •4.9.2. Полиморфизм позднего связывания и виртуальные функции.
- •4.9.3. Абстрактные методы и классы.
- •4.10.1. Функции консольного ввода-вывода.
- •4.10.2. Функции файлового ввода-вывода.
- •4.10.3. Использование библиотеки классов потокового ввода-вывода.
- •4.11.1. Перегрузка операций.
- •4.11.2. Шаблоны функций.
- •4.11.3. Шаблоны классов.
- •4.11.4. Обработка исключений.
- •Тема 4.12. Com-технология.
- •4.12.1. Основные понятия.
- •4.12.2. Типы интерфейсов.
- •Свойства интерфейсов
- •Типы интерфейсов
- •4.12.3. Типы com-объектов.
- •4.12.4. Фабрика классов.
- •Тема 4.13. Построение com-сервера.
- •4.13.1. Язык idl.
- •Содержимое файла idl
- •4.13.2. Определение пользовательского интерфейса.
- •4.13.3. Реализация пользовательского интерфейса.
- •4.13.4. Создание тестового клиента.
- •Тема 4.14. Обзор платформы ms .Net.
- •4.14.1. Общая идея архитектуры .Net.
- •4.14.2. Достоинства и недостатки .Net.
- •4.14.3. Схема трансляции программ в .Net.
- •4.14.4. Язык msil.
- •4.14.5. Объектно-ориентированная модель .Net.
4.10.2. Функции файлового ввода-вывода.
В заголовке stdio.h даны прототипы функций для работы с файлами. Там же определена специальная структура типа FILE, поля которой содержат системную информацию о файле, например, указатель на буфер обмена, размер буфера, флаги статуса файла и т. д. Пользователь может не знать подробности строения и использования системой этой структуры, но он должен описать переменную типа FILE* и использовать ее при вызове функций, оперирующих с файлами.
Действия по открытию файла могут быть, например, такими:
char *fn = "test.txt"; //Имя файла
FILE *fp; // Указатель па файловую структуру
while ((fp=fopen (fn, "rt"))= =NULL
if (YesNo ("Файл не найден. Выход ?")) exit(l);
В этом фрагменте поиск файла и попытка его открыть с помощью функции fopen осуществляются в цикле while. Тем самым мы даем возможность пользователю как-то исправить положение, если попытка оказалась неудачной. Например, вставить дискету. Предполагается, что функция YesNo, предоставляющая пользователю меню из двух альтернатив и возвращающая сделанный выбор, создана и доступна. В случае успеха указателю типа FILE* присваивается значение, возвращаемое библиотечной функцией fopen. Эта функция пытается найти и открыть файл с именем, задаваемым первым параметром, и связать поток ввода-вывода с указателем fp. Второй параметр определяет режим доступа. Он представляет собой константную строку текста, символы которой могут принимать следующие значения:
• r - открыть существующий файл только для чтения;
• r+ - открыть существующий файл для обновления (чтения и записи);
• w - создать для записи. Если файл с указанным именем уже существует, он будет разрушен;
• w+ - создать новый файл для обновления. Если файл уже существует, то он разрушается;
• а - открыть для записи в конец файла или создать для записи, если файл не существует;
• а+ —открыть (или создать) для чтения и записи, но в конец файла.
Чтобы указать компилятору, что данный файл открывается (создается) для чтения (записи) в текстовом формате (а не в двоичном), следует добавить символ t, например "rt", "w+t" и т. д.
Режим обработки чисел (binary mode) отмечается символом b, например, а+b, wb и т. д.
В случае успеха функция fopen возвращает указатель на вновь открытый поток. Если попытка оказалась неудачной, она возвращает NULL.
Библиотека ввода-вывода stdio.h имеет много других функций для более тонкой работы с файлами, например:
void rewind (FILE* stream); - переустанавливает указатель файла на начало потока;
int fseek(FILE *stream,long offset,int origin); - перемещает указатель в заданную позицию;
int fclose(FILE *stream); – закрывает файл;
char *fgets( char *string, int n, FILE *stream ); - чтение строки текста из потока, где
String- место размещения даны; N – максимальное количество символов, которые должны быть считаны; stream – указатель на структуру FILE;
int fgetc( FILE *stream ); - чтение символа из потока;
int fprintf( FILE *stream, const char *format [, argument ]...); - форматированный вывод в текстовый файл. Аналгогично printf, но первый параметр – указатель на файловую структуру;
int fputc( int c, FILE *stream ); - Вывод символа с в текстовый файл
FILE *stream;
char line[100];
if( (stream = fopen( "fgets.c", "r" )) != NULL )
{
while (feof( stream ) = = 0)
{
if( fgets( line, 100, stream ) = = NULL)
printf( "fgets error\n" );
else
printf( "%s", line);
}
fclose( stream );
}
Функции для работы с бинарным файлом
Чтение неформатированных данных из потока:
size_t fread( void *buffer, size_t size, size_t count, FILE *stream );
Параметры
Buffer – место для размещения данных
Size – размер единицы данных в байтах
Count – макс. кол-во единиц, которые должны быть прочитаны
Stream – указатель на структуру FILE.
Возвращает количество действительно прочитанных данных.
Запись неформатированных данных в файл:
size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream );
Параметры:
Buffer – указатель на место размещения записываемых данных
Size – размер единицы данных в байтах
Count – макс. кол-во единиц, которые должны быть записаны
Stream – указатель на структуру FILE.
Возвращает количество фактически записанных данных
Пример
/* FREAD.C: This program opens a file named FREAD.OUT and
* writes 25 characters to the file. It then tries to open
* FREAD.OUT and read in 25 characters. If the attempt succeeds,
* the program displays the number of actual items read.
*/
#include <stdio.h>
void main( void )
{
FILE *stream;
char list[30];
int i, numread, numwritten;
/* Open file in text mode: */
if( (stream = fopen( "fread.out", "w+t" )) != NULL )
{
for ( i = 0; i < 25; i++ )
list[i] = (char)('z' - i);
/* Write 25 characters to stream */
numwritten = fwrite( list, sizeof( char ), 25, stream );
printf( "Wrote %d items\n", numwritten );
fclose( stream );
}
else
printf( "Problem opening the file\n" );
if( (stream = fopen( "fread.out", "r+t" )) != NULL )
{
/* Attempt to read in 25 characters */
numread = fread( list, sizeof( char ), 25, stream );
printf( "Number of items read = %d\n", numread );
printf( "Contents of buffer = %.25s\n", list );
fclose( stream );
}
else
printf( "File could not be opened\n" );
}
Результат
Wrote 25 items
Number of items read = 25
Contents of buffer = zyxwvutsrqponmlkjihgfedcb