Выкладываю последнюю версию своей базы данных, больше ничего менять не буду. Советую сразу исключить 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)