Функция 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); }