Консультация № 182645
28.03.2011, 09:17
52.03 руб.
0 0 0
Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос:Помогите с программой на С++, ОС Windows XP, Borland Builder 6.
Помогите осуществить следующее действие.
После того как программа вывела на экран таблицу:

0: 0 арвыфпврфп, 1 оврпаврпфвр, 3 ыкрывпарвыпр;
1: 56 воларвыапро, 456 вапвыпрвпрвп, 500 ворвпкрвпырф;
3:54 вырвыпарв, 5456 выопрвпвораоы, 98798 ивырфапрыфв;
5: 0 виаврмрв, 1 воаровров, 5 оврпоарпоав;
6: 54 раворва, 980 раворворпав, 990 вораоврова;
7: 5 оварворов, 89 варовраев, 115 выорккурпр;

Выполнить следующие действия:
1. В меню:
1) добавить
2) удалить
3) очистить
4) вывести
5) переместить из файла двоичного в текстовый файл // данный пункт нужно добавить в меню
6) выход

2. Выберите пункт: 5
3. Ввести имя текстового файла
4. Переместить строковую информацию из бинарного файла в текстовый файл
5. Вывести на экран текстовый файл

В текстовом файле строковая информация должна отображаться в таком же порядке, как и в таблице.

Как осуществить процесс перемещения строковой информации из двоичного файла в текстовый файл и обратно.


Приложение:
В данный код нужно добавить функцию которая будет осуществлять выше описанное действие
#include <windows.h>
#include <string.h>
#include <stdio.h>
#include <conio.h>
#include <iostream>
using namespace std;

const int size = 10; //максимальный размер
int factsz; //фактический размер
char filename [MAX_PATH];

struct Item {
int release; /* номер версии */
int len;
long ofs;
//char *string; /* указатель на структуру символов */
Item *next; /* указатель на следующий элемент */
};

struct Node {
int key; /* ключ элемента */
Item *info; /* указатель на информацию */
} table[size];

//функции списка

bool SaveToFile (long& offset, char* info) //сохранение в файл строковой информации
{
FILE* f = fopen (filename, "a+b"); //открываем для добавления в конец
if (f==NULL) return false;
fseek (f, 0, SEEK_END); //ставим указатель в файле на его конец
offset = ftell(f); //сохраняем текущее смещение
int l = strlen(info);
if (l!=fwrite (info, 1, l, f)) {fclose (f); return false; }
else { fclose (f); return true;}
}
void AddLast (Item* &sp, int rel, char* str) //добавление в конец списка
{
Item* tmp = sp;
while (tmp!=NULL && tmp->next!=NULL) tmp = tmp->next;
if (tmp!=NULL) { //если список не пуст
tmp->next = new Item;
tmp = tmp->next;
} else { //если список новый
tmp = new Item;
sp = tmp;
}
tmp->next = NULL;
tmp->release = rel;
tmp->len = strlen(str);
//strcpy (tmp->string, str);
if (!SaveToFile (tmp->ofs, str)) cout << "Error!";
}

void AddSorted (Item* &sp, int rel, char* str) //добавление по порядку в список
{
if (sp==NULL) AddLast (sp, rel, str);
Item* tmp = sp;
Item* buf = new Item;
buf->release = rel;
buf->len = strlen(str);
if (!SaveToFile (buf->ofs, str)) cout << "Error!";
//buf->string = new char [strlen(str)+1];
//strcpy (buf->string, str);

if (tmp->release>=rel) {
buf->next = tmp;
sp = buf;
} else {
while (tmp->next!=NULL && tmp->next->release<rel) tmp = tmp->next;
buf->next = tmp->next;
tmp->next = buf;
}
}


bool DelByRelease (Item* &sp, int rel) //удаление по числовому полю
{
Item* tmp = sp, *d;
if (tmp==NULL) return false; //если список пуст
if (tmp->release==rel) { //если это первый элемент
sp = tmp->next;
//delete [] tmp->string;
delete tmp;
return true;
}
while (tmp->next!=NULL && tmp->next->release!=rel) tmp = tmp->next;
if (tmp->next==NULL && tmp->release!=rel) return false; //если нет такого
d = tmp->next; ///если нашли
tmp->next = tmp->next->next;
//delete [] d->string;
delete d;
d = NULL;
return true;
}

char* ReadFromFile (char* buf, long ofs, int len, FILE* f)
//чтение из файла в буфер с заданным смещением, возвращает указатель на тот же буфер для удобства
{
if (f==NULL) return 0;
if (fseek (f, ofs, SEEK_SET)) return 0; //смещаемся на нужное место
fread (buf, 1, len, f); //читаем заданное число байт
buf[len] = '\0';
return buf;
}
void Print (Item* sp) //вывод списка на экран
{
FILE* f = fopen (filename, "rb");
Item* tmp = sp;
char* buf;
while (tmp!=NULL) {
buf = new char [tmp->len+1];
cout << tmp->release << " " << ReadFromFile(buf, tmp->ofs, tmp->len, f) << "; ";
tmp = tmp->next;
delete [] buf;
}
fclose (f);
}
void Clear (Item* &sp) //очистка памяти из-под списка
{
Item* tmp = sp, *d;
while (tmp!=NULL) {
d = tmp; //сохраняем ссылку
tmp = tmp->next; //переходим на следующий
//delete [] d->string; //удаляем строку
delete d; //удаляем элемент
d = NULL;
}
}

//
//функции таблицы

/*int SearchInTable (int key) //поиск в таблице по ключу
{
for (int i=0; i<factsz; i++)
if (table[i].key==key) return i;
return -1; //-1 если не нашли
}*/

int BinarySearchInTable (int key)
{
int first = 0; // Первый элемент в массиве
int last = factsz-1; // Последний элемент в массиве

if ( key < table[first].key || key > table[last].key ) {
return -1;
}

int mid = ( first + last ) / 2; // В Си это эквивалентно целочисленному делению на 2 в других языках (дробная часть отсекается)

while ( first < last ) {

if ( key <= table[mid].key ) {
last = mid;
} else {
first = mid + 1;
}
mid=first+(last-first)/2;//Таким образом в вычислениях выйти за пределы значений для данного типа невозможно
}

if ( table[last].key == key ) {
return last;
} else {
return -1;
}
}

bool AddNew (int key, int rel, char* str) //добавление нового
{
int j = BinarySearchInTable(key); //ищем, есть ли такой ключ
if (j==-1) { //если нет
if (factsz+1>size) return false; //если таблица заполнена
factsz++; //если можно добавить ещё элемент
table[factsz-1].key = key; //создаём новый
AddLast (table[factsz-1].info, rel, str);
} else { //если ключ уже есть
AddLast (table[j].info, rel, str); //добавляем в существующий
}
return true;
}

bool AddNewSorted (int key, int rel, char* str) //добавление нового
{
int j = BinarySearchInTable(key); //ищем, есть ли такой ключ
if (j==-1) { //если нет
if (factsz+1>size) return false; //если таблица заполнена
int ins = factsz;
for (int i=0; i<factsz; i++)
if (table[i].key>=key) {ins = i; break;}
factsz++; //если можно добавить ещё элемент
for (int i=factsz-1; i>ins; i--) {
table[i].key = table[i-1].key;
table[i].info = table[i-1].info;
}
table[ins].key = key; //создаём новый
table[ins].info = NULL;
AddLast (table[ins].info, rel, str);
} else { //если ключ уже есть
AddSorted (table[j].info, rel, str); //добавляем в существующий
}
return true;
}

bool delByKeyAndRel (int key, int rel) //удаление по ключу и релизу
{
int j = BinarySearchInTable (key); //ищем в таблице
if (j==-1) return false; //если такого ключа нет - выходим
return DelByRelease (table[j].info, rel); //иначе пытаемся удалить из списка
}

void Clear () //очистка талицы
{
for (int i=0; i<factsz; i++)
Clear (table[i].info); //очищаем все списки
factsz = 0;
}

void Print () //печать таблицы
{
for (int i=0; i<factsz; i++) {
cout << endl << table[i].key << ": ";
Print (table[i].info); //печатаем список
}
}

///////////////////

int Menu () //вывод меню
{
int c;
cout << "1. Add new record.\n2.Delete record.\n3.Clear table.\n4.Print table.\n5.Exit.\n";
cout << "Enter menu item: ";
cin >> c;
while (c<=0 || c>5) {
cout << "Uncorrect! Reenter: ";
cin >> c;
}
return c;
}

void Add1 () //пункт 1
{
int key, rel;
char str [50];
cout << "\nEnter key, release and string:\n";
cin >> key;
cin >> rel;
cin >> str;
if (AddNewSorted (key, rel, str)) {
cout << "\nSuccess. Press any key to continue.";
_getch ();
} else {
cout << "\nFailure. Not enougth memory. Press any key to continue.";
_getch();
}
}

void Delete2 () //пункт 2
{
int key, rel;
cout << "\nEnter key and release:\n";
cin >> key;
cin >> rel;
if (delByKeyAndRel (key, rel)) {
cout << "\nSuccess. Press any key to continue.";
_getch ();
} else {
cout << "\nFailure. No such record. Press any key to continue.";
_getch();
}
}

void Clear3 () //пункт 3
{
Clear ();
cout << "\nSuccess. Press any key to continue.";
_getch ();
}

void Print4 () //пункт 4
{
Print ();
cout << "\nPress any key to continue.";
_getch ();
}

int _tmain(int argc, _TCHAR* argv[])
{
factsz = 0; //фактическое число элементов в таблице = 0
bool b = true; //флаг выхода
cout << "Input file name: ";
cin >> filename;
while (b) {
system ("cls"); //очистка экрана
int c = Menu (); //вывод меню
switch (c) { //обработка выбора
case 1: Add1();
break;
case 2: Delete2();
break;
case 3: Clear3();
break;
case 4: Print4();
break;
case 5: b = false;
break;
}
}
Clear (); //очистка памяти
DeleteFile (filename);
return 0;
}

Обсуждение

Форма ответа