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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++] Исправить ошибку в работе с файлами 
V
    Опции темы
Night_xxx
Дата 3.4.2007, 01:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 7.1.2007
Где: Набережные Челны

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



Помогите мне справить небольшой недочет в моей задачке, а именно в функции удаления:
Короче вначале вводим например 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();
}

PM MAIL   Вверх
Xenon
Дата 3.4.2007, 03:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Это полный ... мда ... а еще более информативно переменную, хранящую в себе студентов ты назвать не мог? Очень информативно: "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();
}


Это сообщение отредактировал(а) Xenon - 3.4.2007, 03:32


--------------------
user posted image  
PM MAIL   Вверх
Night_xxx
Дата 3.4.2007, 03:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 7.1.2007
Где: Набережные Челны

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



Xenon, Спасибо тебе конечно, да я сам уже к этому времени разобрался в чем моя ошибка. НУ ДО ВСТРЕЧИ!!!!!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

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

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


 




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


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

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