Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C++] Исправить ошибку в работе с файлами


Автор: Night_xxx 3.4.2007, 01:25
Помогите мне справить небольшой недочет в моей задачке, а именно в функции удаления:
Короче вначале вводим например 3 записи
Номер записи--------1
Фамилия -------------Иванов
Номер группы-------26
Оценки----------------1 2 3 4 5 6 7

Номер записи--------2
Фамилия--------------Петров
Номер группы-------34
Оценки----------------2 3 3 3 3 3 3

Номер группы-------3
Фамилия -------------Сидоров
Номер группы-------51
Оценки----------------3 4 4 4 4 4 4

Потом вызываем функцию удаления и удаляем например запись 2
Потом читаем файл и получается:
Номер записи--------1
Фамилия -------------Иванов
Номер группы-------26
Оценки----------------1 2 3 4 5 6 7

Номер группы-------2
Фамилия -------------Сидоров
Номер группы-------51
Оценки----------------3 4 4 4 4 4 4

Номер группы-------3
Фамилия -------------Сидоров
Номер группы-------51
Оценки----------------3 4 4 4 4 4 4

Т.е. запись номер 3 должна была стать пустой, но этого не произошло, я даже условие специальное написал, чтобы оно обнулилось, но все никак
if(i==p)
{
  for(l=0;l<32;l++)
       {
        ff[l]=0;
        }
}


Код

#include "stdafx.h"
#include <iostream.h>
#include <fstream.h>
#include "stdlib.h"
#include <string.h>
#include <conio.h>
#include "stdio.h"

struct STUDENT 
{
    char familiya[20];
    int nomer_gruppi;
    double sr_usp;
};

STUDENT f[10];

void write();
void read();
void menu();
void udalenie();
//void voz_sr_ball();

int recsize = 20+4+8;

fstream fbin;

int main()
{
    char filekatalog[81];
    char filename[81];
    printf("Vvedite katalog dla faila: ");        cin.getline(filekatalog,80);
    printf("\nVvedite imya faila dla zapisi: ");    cin.getline(filename,80);
    strcat(filekatalog,filename);
    fbin.open(filekatalog, ios::binary | ios::in | ios::out);
    if(!fbin)
    {
        cout << "\aFail " << filename << " ne bil uspershno otkrit";
        return -1;
    }
    
    menu();
    fbin.close();
    
    return 0;
}

void menu()
{
    
    int choice = 0;
    
    system ("cls");
    cout << "\n\n\t\t-----------------------------------";
    cout << "\n\n\t\t|****************MENU**************|";
    cout << "\n\n\t\t|Zapicati v fail     ------ PRESS 1|"; 
    cout << "\n\n\t\t|Prochitati zapici   ------ PRESS 2|"; 
    cout << "\n\n\t\t|Udalenie zapici     ------ PRESS 3|";
    cout << "\n\n\t\t|Vivod po > sr.balla ------ PRESS 4|";
    cout << "\n\n\t\t|Vixod iz programmi  ------ PRESS 5|";
    cout << "\n\n\t\t-----------------------------------";
    cout << "\n\n\n\t\t\t\tVash vibor  \n\t\t\t\t";
    cin >> choice;
    switch(choice)
    {
    case 1: write();
        break;
    case 2: read();
        break;
    case 3: udalenie();
        break;
//    case 4: voz_sr_ball();
    //    break;
    case 5: break;
    default:cout << "Nepravilnij vibor";  menu();
        break;
    }
}

void write()
{
    
    int i,n;
    double sum;
    int o[7];
    char choice = 'y';
    
    do
    {
        sum=0;
        cout << "\nVvedite nomer dla zapici ";
        cin >> n;
        n-=1;
        
        fbin.seekg(recsize * n);    
        
        printf("\nvvedite familiyu i iniciali: "); gets(f[n].familiya); fbin.write(f[n].familiya,20);
        cout<<"\nVvedite nomer gruppi: "; cin>>f[n].nomer_gruppi;  fbin.write(reinterpret_cast<char*>(&f[n].nomer_gruppi),4);
        cout<<"\nVvedite ocenki po 7 predmetam: "; i=0; while(i<7) {cin>>o[i]; i++;}
        for(i=0;i<7;i++)
        {
            sum+=o[i];
        }
        f[n].sr_usp=sum/7;    fbin.write(reinterpret_cast<char*>(&f[n].sr_usp),8);
        
        fbin.clear();
        
        cout << "Prodoljiti? (y/n)"; 
        cin >> choice;
    }while(choice != 'n');
    menu();
    
}

void read()
{
    char familiya[20];
    int nomer_gruppi;
    double sr_usp;
    char choice = 'y';
    int n;
    do
    {
        cout << "\nVvedite nomer otkuda budem 4itati dannnie: "; 
        cin >> n;
        
        n-=1;
        fbin.seekg(n*recsize);
        fbin.read(familiya,20);
        fbin.read(reinterpret_cast<char*>(&nomer_gruppi),4);
        fbin.read(reinterpret_cast<char*>(&sr_usp),8);
        fbin.clear();
        
        cout << "Familiya - " << familiya << endl;
        cout << "Nomer gruppi - " << nomer_gruppi << endl;
        cout << "Srednya uspevaemosti - " << sr_usp << endl;
        for(int i=0;i<20;i++)
        {
            familiya[i]=0;
        }
        nomer_gruppi=NULL; 
        sr_usp=NULL;
        cout << "Prodoljim? (y/n)"; 
        cin >> choice;
    }while(choice != 'n');
    menu();
    
}

void udalenie()
{
    int i,n,p=0,l;
    char choice = 'y';
    char ff[32];
    char output[20];
    
    for(i=0;i<20;i++)
    {
        fbin.seekg(i*recsize);
        
        fbin.read(output,20);
        if(output[0]!=0)p++;
        for(l=0;l<20;l++)
        {output[l]=0;}
        fbin.clear();
    }
    
    do
    {
        cout << "\nVvedite nomer zapici dla udaleniya ";
        cin >> n;
        
        for( i=n;i<=p;i++)
        {
            fbin.seekg(i*recsize);
            fbin.read(ff,32);
            
            fbin.seekg((i-1)*recsize);
            if(i==p)
            {
                for(l=0;l<32;l++)
                {
                    ff[l]=0;
                }
            }
            fbin.write(ff,32);
            
            fbin.clear();
            
        }
        cout << "Prodoljiti? (y/n)"; 
        cin >> choice;
    }while(choice != 'n');
                menu();
}

Автор: Xenon 3.4.2007, 03:32
Это полный ... мда ... а еще более информативно переменную, хранящую в себе студентов ты назвать не мог? Очень информативно: "n", "p", "f" ... Ты хочешь чтобы кто-то в этом еще и разобрался? 
Я тебе уже говорил - пересмотри проектирование.
Ну да ладно, я попытался сделать из того, что у тебя есть. Конечно же получилось убого, но иначе здесь не сделаешь (либо все почти нужно пересматривать)
Код

void udalenie()
{
    char choice = 'y';
    int pos = 0;
    int count = 0;
    int* to_delete = new int[10];
    do
    { 
        cout << "\nVvedite nomer zapici dla udaleniya ";
        cin >> pos;
        to_delete[count++] = pos;
        cout << "Prodoljiti? (y/n)"; 
        cin >> choice;
    }while(choice != 'n');
    std::sort(to_delete,to_delete+count);
    for (int i = 0,j = 0; i < 10; ++i)
    {
        if (to_delete[j++] == i) continue;
        fbin.write(f[i].familiya,20);
        fbin.write(reinterpret_cast<char*>(&f[i].nomer_gruppi),4);
        fbin.write(reinterpret_cast<char*>(&f[i].sr_usp),8);
    }
    delete [] to_delete;
    menu();
}

Автор: Night_xxx 3.4.2007, 03:39
Xenon, Спасибо тебе конечно, да я сам уже к этому времени разобрался в чем моя ошибка. НУ ДО ВСТРЕЧИ!!!!!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)