Uploaded by Василий Чаганов

laba1

advertisement
Функция CreateFile
Функция создаёт указатель на новое устройство типа:







Файл
Канал
mailslot (почтовый канал)
комуникационный ресурс (например COM порт)
дисковые устройства (только для Windows NT)
консоли
директории (открывает их)
Все эти функции описаны в одном файле. Для С/С++ в хедере (заголовочный
файл) winbase.h, для Delphi в модуле windows.pas. Чтобы использовать в
своей программе эти функции, достаточно подключить их к своему проекту и
вперед. Замечу для тех, кто кодит на С/С++ — кроме winbase.h надо
подключить еще windows.h.
Описание:С++
1
HANDLE CreateFile(
// Указатель на имя файла (устройства)
2
LPCTSTR lpFileName,
3
DWORD dwDesiredAccess, //Параметры доступа
4
DWORD dwShareMode,
5
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
6
DWORD dwCreationDistribution,// Описание
7
DWORD dwFlagsAndAttributes,
8
HANDLE hTemplateFile
9
//Разделяемый доступ
//безопасность
// Атрибуты файла
// Файл шаблона
);
Функция WriteFile
Данная функция предназначена для записи в файл или устройство
ввода/вывода. С ней все аналогично что и с функцией ReadFile(). В случае
успешного выполнения операции чтения, возвращается логическое значение
true, иначе false. А функция GetLastErrorвернет ERROR_HANDLE_EOF.
C++
?
1
BOOL WriteFile(HANDLE hFile, //собственно указатель на файл
2
LPVOID lpBuffer, // указатель на буфер - откуда записываем
данные в файл
3
4
DWORD nNumberOfBytesToWrite, //объем записываемых данных
LPDWORD lpNumberOfBytesWrite, //фактический размер
5
записанных данных
6
LPOVERLAPPED lpOverlapped // флаг режима доступа к файлу:
асинхронный(<strong>FILE_FLAG_OVERLAPPED</strong>)
7
//или синхронный(<strong>NULL</strong>)
);
Теперь рабочий пример:
1
{
2
Handle FileHandle;
3
char Buf[1000];
4
...
5
ReadFile(FileHandle, Buf, sizeof(buf),NULL);
6
...
7
}
Пример: Открытие файла для чтения
Фрагмент нижеследующего кода использует CreateFile, чтобы открыть
существующий файл для чтения.
#include <windows.h>
#include <stdio.h>
HANDLE hFile;
hFile = CreateFile(TEXT("myfile.txt"), // открываемый файл
GENERIC_READ,
// открываем для чтения
FILE_SHARE_READ,
// для совместного чтения
NULL,
// защита по умолчанию
OPEN_EXISTING,
// только существующий файл
FILE_ATTRIBUTE_NORMAL, // обычный файл
NULL);
// атрибутов шаблона нет
if (hFile == INVALID_HANDLE_VALUE)
{
printf("Could not open file (error %d)\n", GetLastError());
return 0;
}
В этом случае, CreateFile завершается успешно только в том случае, если
файл по имени Myfile.txt уже существует в текущем каталоге. Последующий
вызов CreateFile открыть этот файл завершится успешно, если вызов
использует тот же самый доступ и режимы совместного использования.
Пример: Открытие файла для записи
Фрагмент нижеследующего кода использует CreateFile, чтобы создать новый
файл и открывает его для записи.
#include <windows.h>
#include <stdio.h>
HANDLE hFile;
hFile = CreateFile(TEXT("myfile.txt"), // создаваемый файл
GENERIC_WRITE,
// открывается для записи
0,
// совместно не используется
NULL,
// защита по умолчанию
CREATE_ALWAYS,
// переписывает существующий
FILE_ATTRIBUTE_NORMAL | // обычный файл
FILE_FLAG_OVERLAPPED, // асинхронный ввод/вывод I/O
NULL);
// атрибутов шаблона нет
if (hFile == INVALID_HANDLE_VALUE)
{
printf("Could not open file (error %d)\n", GetLastError());
return 0;
}
Последующий вызов CreateFile, чтобы открыть этот файл, завершится
ошибкой, пока дескриптор не закроется.
Пример демонстрирующий запись в бинарный файл структуры с
несколькими полями:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#define MAX_STR 256 // Максимальная длина временного буфера
#define MAX_PHONE 10 // Макисмальная длина номера телефона
#define MAX_COST 8 // Макисмальная длина сметы
#define MAX_ID 3 // Макисмальная длина шифра объекта
#define MAX_ADDRESS 15 // Макисмальная длина адреса объекта
#define MAX_SHORTNAME 10// Максимальная длина фамилии, имени или
отчества
#define MAX_NAME 35 // Макисмальная длина полного имени заказчика
#define DATA_FILENAME "MyFile.dat" // Имя файла данных
// Структура описывающая один оюъект
struct SObject
{
char ID[MAX_ID + 1]; // Шифр
char Address[MAX_ADDRESS + 1]; // Адресс
char Customer[MAX_NAME + 1]; //ФИО заказчика
char Phone[MAX_PHONE + 1]; // Номер телефона
char Cost[MAX_COST + 1]; // Смета
}obj;
int ShowMenu(); // Функция показывающая меню (возвращает код
выбранного пункта меню)
void CreateFile(); // Функция создающая файл и записывающая туда
информацию об объектах
void ReadField(const char msg[MAX_STR], char* dest, const int nSize); //
функция считывания одного поля структуры
void ViewFile(); // функция показывающая содержимое файла
void Search(); // функция поиска объектов по заказчику
int main()
{
while (1) // выполняем в бесконечном цикле
{
switch( ShowMenu() ) // показываем меню и проверяем что выбрал
пользователь
{
case 1: CreateFile(); break; // если 1 то создаём файл и заносим инфо
case 2: ViewFile(); break; // если 2 то показываем содержимое файла
case 3: Search(); break; // если три, то выполняем поиск
case 4: return 0; // если 4 то выходим из программы
default: // если другая кнопка, ничего не делаем
break;
}
}
}
void ReadField(const char msg[MAX_STR], char* dest, const int nSize)
{
/*
Тут мы считываем значение одного поля структуры (например адрес или
шифр объекта)
Существует защита от ввода длинных значений. В поле занесётся только
заданное константами число символов.
*/
char buff[MAX_STR] = { 0 }; // временный буфер
printf( msg ); scanf("%s", &buff ); // Предлагаем ввести значение и
считываем его во временный буфер
(void)strncpy( dest, &buff, nSize ); // Копируем из временного буфера куда
надо
dest[nSize] = '\0'; // Дописываем нульсимвол в конце строки
}
void CreateFile()
{
int N = 0, i = 0;
char F[MAX_SHORTNAME] = {0}, I[MAX_SHORTNAME] = {0},
O[MAX_SHORTNAME] = {0};
FILE *data = fopen( DATA_FILENAME, "wb" ); // открываем файл на
запись
if( data == NULL )
{
// Если файл открыть/создать не удалось, то выводим соответствующую
ошибку и выходим.
puts("Could not open file for write."); getch();
return;
}
// Запрашиваем количество записей
printf("Skolko zapisey budem delat? "); scanf("%d", &N);
// N раз считываем данные о объектах
for( i = 1; i <= N; i++)
{
printf("\n Object #%d\n", i);
ReadField("ID: ", &(obj.ID), MAX_ID); // Считываем шифр
ReadField("Address: ", &(obj.Address), MAX_ADDRESS); // Считываем
адрес
ReadField("SurName: ", &F, MAX_SHORTNAME); // Считываем
фамилию
ReadField("Name: ", &I, MAX_SHORTNAME); // Считываем имя
ReadField("Patronymic: ", &O, MAX_SHORTNAME); // Считываем
отчество
obj.Customer[0] = '\0';
// далее составляем из всего этого одно целое имя ФИО
strcat(obj.Customer, F); strcat(obj.Customer, " ");
strcat(obj.Customer, I); strcat(obj.Customer, " ");
strcat(obj.Customer, O);
ReadField("Phone: ", &(obj.Phone), MAX_PHONE); // Считываем номер
телефона
ReadField("Cost: ", &(obj.Cost), MAX_COST); // Считываем смету
fwrite(&obj, sizeof(obj), 1, data);
}
fclose(data); // закрываем файл
printf("Data saved succesfully. Press any to continue...");
getch();
}
void ViewFile()
{
int i = 0;
FILE *data = fopen( DATA_FILENAME, "rb" ); // открываем файл на чтение
if( data == NULL )
{
// Если файл открыть не удалось, то выводим соответствующую ошибку и
выходим.
puts("Could not open file for read. Press any to continue..."); getch();
return;
}
// выводим шапку таблицы
printf(" ID
Address
Customer
Phone
Cost");
while( 1 )
{
// Считываем все структуры, пока не конец файла
fread(&obj, sizeof(obj), 1, data);
// Выводим считанные данные
if( !feof(data))
{
printf("\n %3s %15s %32s %10s %8s", obj.ID, obj.Address, obj.Customer,
obj.Phone, obj.Cost);
}
else
{
break;
}
}
fclose(data); // закрываем файл
printf("\n\nPress any to continue...");
getch();
}
void Search()
{
char buff[MAX_NAME] = { 0 };
char F[MAX_SHORTNAME] = {0}, I[MAX_SHORTNAME] = {0},
O[MAX_SHORTNAME] = {0};
FILE *data = fopen( DATA_FILENAME, "rb" ); // открываем файл на чтение
if( data == NULL )
{
// Если файл открыть не удалось, то выводим соответствующую ошибку и
выходим.
puts("Could not open file for read. Press any to continue..."); getch();
return;
}
// Запрашиваем имя заказчика. Для поиска всех его объектов.
printf("Input name of Customer: "); scanf("%s %s %s", &F, &I, &O);
// Составляем из Ф.И.О. полное имя в одну строку.
strcat(buff, F); strcat(buff, " "); strcat(buff, I); strcat(buff, " "); strcat(buff, O);
// выводим шапку таблицы
printf("\n ID
Address
Customer
Phone
Cost");
while( 1 )
{
// Считываем все структуры, пока не конец файла
fread(&obj, sizeof(obj), 1, data);
if( !feof(data) )
{
if( !strcmp( obj.Customer, buff ))
{
printf("\n %3s %15s %32s %10s %8s", obj.ID, obj.Address,
obj.Customer, obj.Phone, obj.Cost);
}
}
else
{
break;
}
}
fclose(data);
printf("\n\nSearch completed. Press any to continue...");
getch();
}
int ShowMenu()
{
char ch = '\0';
clrscr(); // очищаем экран
// рисуем меню
puts("1 : Create a file");
puts("2 : View a file");
puts("3 : Search");
puts("4 : Exit");
// считываем выбор пользователя
ch = getch();
// очищаем экран
clrscr();
// возвращаем код выбранного меню
return atoi(&ch);
}
Download