Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++] Программа-справочник, Функция удаления записи из файла  
:(
    Опции темы
umnik90
  Дата 11.6.2009, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 11.6.2009

Репутация: нет
Всего: нет



Такое уже было - смотрел в поиске, но ничего не подошло. 
Цитата

#include <iostream.h>
#include <conio.h>    
#include <string.h>
#include <iomanip.h> 
#include <fstream.h>
#include <windows.h> 

ostream & operator<<(ostream & out,char *s)
{
    char bufer[512], *p=bufer;
    CharToOem(s, bufer);
    while(*p)              //Функция CharToOem преобразует  
  out<<*p++;         //строку в набор символов ОЕМ.  
    return out;


class sprav_video {
private:
    char manuf;
    char charact;
    int price;
    friend ostream & operator<<(ostream &stream, sprav_video &o1);
    friend void shapka();
    friend void linebuild();
public:
    int n;
    void add();
    void del();
  void del2();
};
class Database: public sprav_video {
    char title[40];
    sprav_video *rows[15];
    int col;
    int sorted;
public:
    Database(char *q) {strcpy(title,q); col=0; sorted=0;}
    ~Database() {if (col) for (int i=0; i<col; i++) delete rows[i];}
    friend ostream & operator<<(ostream &stream, Database &temp);
};


ostream & operator<<(ostream &stream, Database &o1) {
    stream<<o1.title<<endl;
    shapka();
    if (!o1.col) stream<<"База заполнена.";
    else {
  for (int i=0; o1.col; i++) {
    stream<<*o1.rows[i];
  }
    }
return stream;
 {
    int i;
    for (i=0; i<5; i++) {
     stream<<*o1.rows[i];
    }
  }
return stream;
}
ostream & operator<<(ostream &stream, sprav_video &o1) {
    stream<<"|"<<setw(10)<<o1.manuf<<"  |  ";
    stream<<setw(30)<<o1.charact<<"|";
    linebuild();
    return stream;
}

/*************Удаление данных из базы*************/

void sprav_video::del()
{
    ofstream outfile("videocards.txt");
    cout<<"\nДанные удалены...\n";
}

/*************Добавление данных в базу************/

void sprav_video::add()
{   n++; 
    ofstream file("videocards.txt",ios::app);
    char a[20], b[20];
    int num;
    int pr;
    {
  cout<<"\nВведите порядковый номер модели: "; 
  cin>>num;
  cout<<"\nВведите название производителя: ";
  cin>>a;
  cout<<"\nПеречислите технические характеристики устройства: ";
  cin>>b;
  cout<<"\nУкажите цену в долларах США: ";
  cin>>pr;
  file<<num<<" "<<a<<" "<<b<<" "<<pr<<endl;
    }
}

void shapka(void)
{
    cout<<"|-------------------------------------------------------------------------|\n";
    cout<<"|                            *** СПРАВОЧНИК ***                           |\n";
    cout<<"|           Современные модели видеокарт, их характеристики и цены        |\n";
    cout<<"|-------------------------------------------------------------------------|\n";
    cout<<"|   №   |   Производитель    |    Характеристики    |   Розничная цена,$  |\n";
    cout<<"|-------------------------------------------------------------------------|\n";
}

void linebuild(void) {
    cout<<"|-------------------------------------------------------------------------|";
}

void sprav_video::del2(){

ofstream doc ("videocards.txt");
int f_num;
cout<<" - ";
cin>>f_num;
for(int i=0;i<=n;i++){ 
if(num==f_num){i++;fl=1;}
doc<<num<<" "<<a<<" "<<b<<" "<<pr<<endl;}
if(fl=1)cout<<"\nЗапись удалена\n";
else cout<<"\nЗапись не удалена\n";}



int main()
{
    Database *abs = new Database("\nБаза данных:\n");
    sprav_video videocards;
    for (int a=0; !a;){
  cout<<"\nЭто справочник по современным моделям видеокарт.";
  cout<<"\nПожалуйста, выберите желаемое действие:";
  cout<<"\n1. Вход в качестве администратора, добавление и удаление записей.";
  cout<<"\n2. Добавить запись по видеокарте.";
  cout<<"\n3. Удалить запись.";
  cout<<"\n4. Вывести базу на экран.";
  cout<<"\n5. Выход из программы.\n";
  cout <<"Ваш выбор: ";
  int q;
  cin>>q;
  switch(q) {
    case 1:
    int z,o;
    cout <<"\n Введите пароль для входа в качестве администратора: ";
    cin>>z;
    if (z==1234){
     o=1;
     cout<<"\n Вы зашли как администратор.\n";
    }
    else {
     cout<<"\n Пароль неверен. Доступ ограничен.\n";
     o=0;
    }
    break;
    case 2: 
    {
     if (o==1)
      videocards.add();
     else
      cout<<"\n Вы не зарегистрированы!\n";
     getch();
     break;
    }
    case 3:
    {
     if (o==1){
      cout<<"Вы действительно хотите удалить данные? (y/n): ";
      char d;
      cin>>d;
      switch(d){
      case 'Y'|'y':
       videocards.del();
        break;
       }
      case 'N'|'n':
       {
        break;
       }
     }
     else{
      cout<<"\n Вы не зарегистрированы!";
      o=0;
      } 
     break;
    } 
    case 4:
    {
     cout<<"\n Для просмотра базы данных нажмите любую клавишу: ";
     cout<<*abs;
     getch();
     char filename[]="videocards.txt";
     int num;
     char manuf[20],charact[20];
     int pr;
     fstream file_show;
     file_show.open("videocards.txt",ios::in | ios::nocreate);
     for(;;)
     {
      file_show>>num;
      if (file_show.eof())break;
      file_show>>manuf>>charact>>pr;
      cout<<endl;
      cout<<"|"<<setw(4)<<setiosflags(ios::right)<<num
       <<setw(4)<<setiosflags(ios::right)<<"|"
          <<setw(7)<<setiosflags(ios::right)<<manuf
       <<setw(8)<<setiosflags(ios::right)<<"|"
          <<setw(5)<<setiosflags(ios::right)<<charact
       <<setw(5)<<setiosflags(ios::right)<<"|"
       <<setw(10)<<pr;
      cout<<"\n";
      linebuild(); 
     }
     break;
    }
    case 5:
    {
      videocards.del2();
    //    cout<<"\n Всего хорошего! ";
    //    a=1;
    //  break;
    }
    default:
    {
     cout <<"\n Неверный выбор.\n";  
     getch();
     break;
    }
  }
    }
  return 0;
}





Метод void sprav_video::del2() (временно запуск стоит в инт_мейне на 5. выход из программы) есть, но он у меня удаляет все строки из файла, а мне нужно только определенную строку, найденную по одному из столбцов. Я уже делал такое, но немного иначе был подход к самомой программе, в этом случае этот же метод не работает правильно. 

Хелп  

Это сообщение отредактировал(а) umnik90 - 11.6.2009, 15:10
PM MAIL   Вверх
andrew_121
Дата 11.6.2009, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



Цитата(umnik90 @  11.6.2009,  15:09 Найти цитируемый пост)
временно запуск стоит в инт_мейне на 5

Это хорошо что ты указал номер строки. Но если бы еще тэг code=cpp, тебе бы ваще цены не было)


Читаешь записи по одной, проверяешь, ни эту ли ты хочешь удалить, если нет, записываешь ее во временный файл, и так до тех пор, пока ни встретится та самая, долгожданная запись, вот тогда ты ее пропускаешь, не записываешь, и читаешь все остальные. Потом файл переименовываешь.
Все.

Добавлено через 53 секунды
Ух ты... Так это ты не про пятую строку...


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
gosn1ck
Дата 12.6.2009, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 18.4.2009

Репутация: 1
Всего: 1



andrew_121, наверно имелось ввиду case 5: smile хорошо, что ты глядел ЧТО он вызывает - был бы очередной шок для тебя  smile 


umnik90, твоя del2 вообще извращение какое-то. особенно вот это if(fl=1)
a, b, pt - вообще не объявлены, а для "флагов" не нужно использовать все 4 байта, можно только 1.

Код

void del2()
{
  ifstream doc ("videocards.txt");

   ofstream doc2 ("videocards2.txt");

   int f_num, pr, num;
   bool fl;
   string a, b;
   cout<<" - ";
   cin>>f_num;
   while (!doc.eof())
   {
     doc>>num>>a>>b>>pr;
     if(num!=f_num){
       doc2<<num<<" "<<a<<" "<<b<<" "<<pr<<endl;
     }
     else fl=true;
   }
   doc.close();
   doc2.close();
   if (fl==true) cout<<"\nЗапись удалена\n";
   remove("videocards.txt");
   rename("videocards2.txt", "videocards.txt");
   remove("videocards2.txt");
}


Это сообщение отредактировал(а) gosn1ck - 12.6.2009, 09:00
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1082 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.