Выкладываю последнюю версию своей базы данных, больше ничего менять не буду. Советую сразу исключить 4 пункт, т.к если Деон про него спросит - Я сам могу не все вспомнить как это делалось. Вообщем если появятся вопросы то пишите, постараюсь ответить.
DZ.cpp
#include <windows.h> #include <stdio.h> #include <conio.h> #include <string.h> #include <ctype.h> #include <locale.h> #include "DataInput.h" #include "PrintHead.h" #include "PrintHeadSearch.h" #include "FillBD.h" #include "PrintData.h" #include "GetRowsCount.h" #include "PrintDataSearch.h" #include "PrintHelp.h" void main() { /* Подключение русского языка */ SetConsoleCP(1251); SetConsoleOutputCP(1251); /* Для того чтобы работала функция strlwr() для русских букв */ setlocale(LC_CTYPE,"Russian"); /* Идентификатор выбранного пункта меню*/ int menuID = 0; while(menuID != 9) { printf("Меню:"); printf("\n 1. Ввод данных"); printf("\n 2. Удаление данных"); printf("\n 3. Добавить запись"); printf("\n 4. Корректировка данных"); printf("\n 5. Заполнить БД эксперементальными данными"); printf("\n 6. Считывание данных из файла"); printf("\n 7. Поиск"); printf("\n 8. Справка по БД"); printf("\n 9. Выход\n"); printf("-----------------------------------------------\n"); printf("Выберите пункт: "); scanf("%d",&menuID); switch(menuID) { case 1: { printf("Какое кол-во элементов Вы хотите ввести: "); /* Сколько поставщиков вводить */ int countProvider; scanf("%d",&countProvider); printf("\n"); HANDLE hF = CreateFile("DBase.txt",GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); for(int count = 0; count<countProvider; count++) { printf("Поле №%d:\n",count + 1); printf("Наименование поставщика: "); DataInput(hF); printf("Город: "); DataInput(hF); printf("Телефон: "); DataInput(hF); printf("e-mail: "); DataInput(hF); printf("\n"); } system("cls"); CloseHandle(hF); printf("Данные успешно записаны!"); getch(); } break; case 2: { /* Создаем файл с тем же именем, затирая существующий */ HANDLE hF = CreateFile("DBase.txt",GENERIC_READ,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); CloseHandle(hF); system("cls"); printf("Данные успешно удалены!"); getch(); } break; case 3: { char s; DWORD m; bool result = true; HANDLE hF = CreateFile("DBase.txt",GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); SetFilePointer(hF,GetFileSize(hF,NULL),NULL,FILE_BEGIN); /* Принимаем новую запись для БД от пользователя */ printf("Наименование поставщика: "); DataInput(hF); printf("Город: "); DataInput(hF); printf("Телефон: "); DataInput(hF); printf("e-mail: "); DataInput(hF); printf("\n"); CloseHandle(hF); system("cls"); printf("Новая запись успешно добавлена!"); getch(); } break; case 4: { /* Печатаем базу данных */ PrintData(); /* Функция возвращает кол-во записей в таблице */ int rowscount = GetRowsCount(); /* Переменная хранит номер поля, которое необходимо редактировать */ int row; do { printf("Введите номер записи, которую необходимо редактировать(ввести не более %d): ",rowscount); scanf("%d",&row); } while(row > rowscount || row <= 0); /* Открываем файл, находим нужную позицию и печатаем туда новые данные */ HANDLE hF = CreateFile("DBase.txt",GENERIC_WRITE | GENERIC_READ,0, NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); DWORD m; /* Хранит кол-во прочитанных байтов */ char s; /* Хранит считываемый символ */ int n = 0; /* Счетчик кол-ва записей */ int n1 = 0; /* Счетчик кол-ва записей при подсчета оставшихся записей */ char *sztemp; /* Указатель, который будет ссылаться на временный массив */ int filesize = 0; /* Хранит сколько нужно выделить пямяти для временного массива */ /* Здесь производится поиск нужной строки, записивается оставшееся содержимое файла в динамический массив sztemp, производтся новая запись и в конце допичывается содержимое массива sztemp */ while(true) { ReadFile(hF,&s,1,&m,NULL); /* Если встречается символ перевода строки, значит дошли до конца записи */ if(s == '\x0a') { n++; if(n/4 == row) { /* Узнаем сколько осталось до донца файла */ while(true) { ReadFile(hF,&s,1,&m,NULL); if(s == '\x0a') { n1++; if(n1/4 == rowscount - row) break; } /* В этой переменной хранится то кол-во символов, которое осталось до конца файла, относительно редактируемой строки */ filesize++; } /* После подстчета кол-ва символов возвращаем файловый указатель в начало редактируемой строки */ SetFilePointer(hF,-filesize-1,NULL,FILE_CURRENT); /* Выполняем инициализирующие действия для подготовки временного буфера для хранения оставшихся данных относительно редактируемой строки */ sztemp = new char[++filesize]; memset(sztemp,0,filesize); /* Читаем из файла во временный буфер все что ниже редактируемой строки */ ReadFile(hF,sztemp,filesize,&m,NULL); /* Ставим указатель в начало редактируемой строки */ if(row == 1) { SetFilePointer(hF,0,NULL,FILE_BEGIN); } else { n = 0; SetFilePointer(hF,0,NULL,FILE_BEGIN); while(true) { ReadFile(hF,&s,1,&m,NULL); if(s == '\x0a') { n++; if(n/4 == row - 1) { SetEndOfFile(hF); break; } } } } break; } } } /* Принимаем новую запись для БД от пользователя */ printf("Наименование поставщика: "); DataInput(hF); printf("Город: "); DataInput(hF); printf("Телефон: "); DataInput(hF); printf("e-mail: "); DataInput(hF); SetEndOfFile(hF); printf("\n"); /* Дописываем в конец редактируемой строки содержимое массива sztemp */ WriteFile(hF,sztemp,filesize,&m,NULL); /* Освобождаем ранее выделенную память под временный массив */ delete []sztemp; CloseHandle(hF); system("cls"); printf("База данный успешно отредактирована!"); getch(); } break; case 5: { FillDB(); system("cls"); printf("База данный успешно заполенена эксперементальными данными!"); getch(); } break; case 6: { PrintData(); printf("\nДля продолжения нажмите любую клавишу..."); getch(); } break; case 7: { /* Создаем временный буфер для считывания каждого поля и просим пользователя ввести искомую организацию */ char szname[20]; printf("Введите название поставщика, город, номер телефона или e-mail: "); gets(szname); gets(szname); /* Печатаем шапку таблицы поиска */ PrintHeadSearch(); /* Выполняем поиск по базе данных */ PrintDataSearch(szname); printf("%s","\nДля продолжения нажмите любую клавишу..."); getch(); } break; case 8: { system("cls"); PrintHelp(); printf("Для продолжения нажмите любую клавишу..."); getch(); } default: break; } system("cls"); } }
DataInput.h
#define KEY_ESC 0x1b /* Код нажатой клавиши ESC */ #define KEY_ENTER 0x0d /* Код нажатой клавиши ENTER */ #define KEY_BACKSPACE 0x08 /* Код нажатой клавиши BACKSPACE */ void DataInput(HANDLE hF) { int i = 0; /* Текущая позиция индекса массива buf (для записи строк) */ char buf[50] = {'\0'}; /* Временный массив для хранения вводимой строки */ DWORD m; /* Кол-во записанных и считанных байт информации */ while(true) { char ch = getch(); /* Считать символ с консоли */ putchar(ch); /* Показать введенный символ */ if(ch != KEY_ENTER) buf[i++] = ch; if(ch == KEY_BACKSPACE) { buf[(i-=2)] = '\x00'; putchar(' '); putchar('\x08'); } if(ch == KEY_ENTER) { buf[i++] = '\x0d'; buf[i++] = '\x0a'; WriteFile(hF,buf,i,&m,NULL); i = 0; printf("\n"); break; } } }
FillBD.h
#include <windows.h> #include <time.h> void FillDB(void) { /* Массивы эксперементальных данных */ char *Name[] = {"ЭлитСтрой\r\n","Эликс Центр\r\n","РемСнаб\r\n","Металлист\r\n","Центр АПТ\r\n","ИнТехСтрой\r\n","СТРОЙМИР\r\n","Строймастер\r\n"}; char *City[] = {"Москва\r\n","Санкт-Петербург\r\n","Тверь\r\n","Новгород\r\n","Москва\r\n","Москва\r\n","Санкт-Петербург\r\n","Тверь\r\n"}; char *Tel[] = {"516-66-60\r\n","145-67-00\r\n","960-34-68\r\n","456-87-90\r\n","555-00-11\r\n","821-73-11\r\n","345-87-23\r\n","567-98-90\r\n"}; char *Email[] = {"stroy@grad.ru\r\n","buld@yandex.ru\r\n","stroyka@bk.ru\r\n","steklobeton@mail.ru\r\n","atp_122@yandex.ru\r\n","intehstroy@ya.ru\r\n","stroy-mir@mail.ru\r\n","stroy@master.ru\r\n"}; HANDLE hF = CreateFile("DBase.txt",GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); DWORD m; for(int x = 0; x<8; x++) { WriteFile(hF,Name[x],strlen(Name[x]),&m,NULL); WriteFile(hF,City[x],strlen(City[x]),&m,NULL); WriteFile(hF,Tel[x],strlen(Tel[x]),&m,NULL); WriteFile(hF,Email[x],strlen(Email[x]),&m,NULL); } CloseHandle(hF); }
GetRowsCount.h
int GetRowsCount(void) { /* Хранит кол-во записей */ int rowscount = 0; HANDLE hF = CreateFile("DBase.txt",GENERIC_READ,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); DWORD m = 1; /* Кол-во счытанных байтов при чтении из файла*/ char s; /* Переменная для хранения считанной переменной */ while(m != 0) { while(true) { /* Читаем по одному символу, если символов нет, то прерываем цикл */ ReadFile(hF,&s,1,&m,NULL); if(m == 0) break; if(s == '\x0a') rowscount++; } } CloseHandle(hF); return rowscount/4; }
PrintData.h
void PrintData(void) { char s; DWORD m = 1; /* Кол-во счытанных байтов при чтении из файла*/ int count = 0; /* Счетчик считанный строк */ HANDLE hF = CreateFile("DBase.txt",GENERIC_READ,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); /* Напечатать шапку таблицы */ PrintHead(); /* Считываем все символы из файла */ while(m != 0) { char buf[50] = {'\0'}; /* Массив для одной считанной записи */ int i = 0; /* Индекс буфера для считываемых символов */ char output[100] = {'\0'}; /* Считываем файл, пока не встретится символ перевода строки, после этого переходим к слудеющей итерации внешнего цикла.*/ while(true) { /* Читаем по одному символу, если символов нет, то прерываем цикл */ ReadFile(hF,&s,1,&m,NULL); if(m == 0) break; buf[i++] = s; if(s == '\x0a') { buf[i-1] = '\0'; strcat(output,buf); if(++count == 4) { printf("%s",strcat(output,"\n")); memset(output,0,strlen(output)); i = 0; count = 0; break; } /* Подставляем нужное кол-во пробелов. */ for(int x = 0; x<(10+(9-strlen(buf))); x++) strcat(output," "); memset(buf,0,strlen(buf)); i = 0; } if(s == '\x0d') // Если встретился символ возврата, то buf[i-1] = '\x00'; // вставляем пустой символ. } } CloseHandle(hF); /* Переводим каретку в начало строки и печатаем подвал таблицы. */ printf("-----------------------------------------------------------------------------\n"); }
PrintDataSearch.h
bool PrintDataSearch(char *name) { char s; DWORD m = 1; /* Кол-во счытанных байтов при чтении из файла*/ int count = 0; /* Счетчик считанный строк */ bool result = false; /* Хранит результат поиска */ HANDLE hF = CreateFile("DBase.txt",GENERIC_READ,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); /* Считываем все символы из файла */ while(m != 0) { char buf[50] = {'\0'}; /* Массив для одной считанной записи */ int i = 0; /* Индекс буфера для считываемых символов */ char output[100] = {'\0'}; /* Считываем файл, пока не встретится символ перевода строки, после этого переходим к слудеющей итерации внешнего цикла.*/ while(true) { /* Читаем по одному символу, если символов нет, то прерываем цикл */ ReadFile(hF,&s,1,&m,NULL); if(m == 0) break; buf[i++] = s; if(s == '\x0a') { buf[i-1] = '\0'; strcat(output,buf); if(++count == 4) { /* Создаем временные массивы для сравнения сток */ char *szname = new char[strlen(name) + 1]; strcpy(szname,name); char *szoutput = new char[strlen(output) + 1]; strcpy(szoutput,output); if(strstr(strlwr(szoutput),strlwr(szname)) != NULL) { printf("%s",strcat(output,"\n")); result = true; } delete []szname; delete []szoutput; memset(output,0,strlen(output)); i = 0; count = 0; break; } /* Подставляем нужное кол-во пробелов. */ for(int x = 0; x<(10+(9-strlen(buf))); x++) strcat(output," "); memset(buf,0,strlen(buf)); i = 0; } if(s == '\x0d') // Если встретился символ возврата, то buf[i-1] = '\x00'; // вставляем пустой символ. } } CloseHandle(hF); /* Переводим каретку в начало строки и печатаем подвал таблицы. */ printf("-----------------------------------------------------------------------------\n"); return result; }
PrintHead.h
void PrintHead(void) { printf("\n БАЗА ДАННЫХ ПОСТАВШИКОВ "); printf("\n-----------------------------------------------------------------------------\n"); printf("Организация Город Телефон E-mail\n"); printf("-----------------------------------------------------------------------------\n"); }
PrintHeadSearch.h
void PrintHeadSearch(void) { printf("\n РЕЗУЛЬТАТЫ ПОИСКА "); printf("\n-----------------------------------------------------------------------------\n"); printf("Организация Город Телефон E-mail\n"); printf("-----------------------------------------------------------------------------\n"); }
PrintHelp.h
void PrintHelp(void) { printf(" ЗДРАВСТВУЙТЕ! \n\n"); printf("Вашему вниманию предлагается учебная база данных \"Поставщики строительных \nматериалов\". "); printf("База данных имеет удобный и понятный интерфейс, с помощью которого\nможно выполнить "); printf("все типовые задачи, которые присутствуют в базах данных. \nНиже приводится описание "); printf("имеющихся в базе данных пунктов меню.\n\n"); printf("1. Ввод данных. С помощью этого пункта меню можно вводить новые данные по \nпоставщику, "); printf("указав его название, город, номер телефона и адрес электронной \nпочты.\n\n"); printf("2. Удаление данных. ОСТОРОЖНО!!! Данный пункт меню полностью удаляет имеющуюся \nбазу данных\n\n"); printf("3. Добавить запись. Позволяет дабавлять нового поставщика. (Новая запись \nдобавляется в конец имеющейся базы данных ) \n\n"); printf("4. Корректировка данных. Данный пункт меню позволяет откорректировать любую \nзапись в имеющейся базе данных. "); printf("Оператору БД необходимо указать номер записи,\nкоторую нужно отредактировать, затем ввести новые данные о поставщике.\n\n"); printf("5. Заполнить БД эксперементальными данными. Этот пункт предназначен для \nдемонстрации отображения данных. После его выполнения "); printf("база данных заполняется \nпримерным набором поставщиков, с помощью которого можно проверить другие \nее возможности.\n\n"); printf("6. Считывание данных из файла. Отображает данные на экране в виде таблицы. \nДанные берутся из файла DBase.txt, который расположен "); printf("в том же каталоге где и \nсама программа.\n\n"); printf("7. Поиск. Позволяет производить поиск по базе данных, причем поиск устроен \nтаким образом, что в качестве строки поиска можно использовать название"); printf("\nгород, номер телефона или адрес электронной почты поставщика. "); printf("В случае если \nв одной или нескольких записей встретится искомая комбинаия символов, то в \nтаблицу \"РЕЗУЛЬТАТЫ ПОИСКА\" будут выведены соответствующие поставщики с их \nполными данными.\n\n"); printf("8. Справка по БД. Позволяет получить полную справку по базе данных.\n\n"); printf("9. Выход. Выход из базыданных.\n\n"); }
Чтобы все заработало, Вам надо в VS создать новый проект и включить в него все эти файлы. Жду Ваших вопросов и комментариев по проге.
Отредактировано Тема (2009-11-11 10:13:17)