Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > C++ > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Здесь нужно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 26.09.2013, 21:51   #1
Grizzz
 
Регистрация: 10.10.2012
Сообщений: 5
По умолчанию В чем может быть ошибка (Файлы и массив структур)

Доброго времени суток. Проблема заключается в процедуре dop()(нужно вставить структуры после определенной структуры поиск осуществляется по ФИО )
все выполняется вроде нормально но как только я ввожу число поступления и нажимаю Enter прога вылетает. Не могу понять в чем ошибка. Заранее спасибо.
Код:
#include <iostream>
#include <string>
#include <fstream>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
 
using namespace std;
struct lol
{
    char FIO[50];
    char diz[30];
    int  post;
    char pol;
} zp;
 
void input(FILE *);
void show ();
void dop (FILE *, char* n);
void search(char* n);
FILE *f;
 
int main ()
{
    setlocale(LC_ALL,"Rus");
    
    char c;
    int n;
    char str[50],ctr[50];
    FILE *f;
    
    f=fopen("base.dat","r");
    c=' ';
    while (c!='0')
    {
        system("cls");
        cout<<"1-create file\n";
        cout<<"2-show file\n";
        cout<<"3-app file \n";
        cout<<"4-search \n";
        cout<<"5-status of patients \n";
        cout<<"0-exit";
        c=getch();
        switch (c)
        { 
            case '1':input(f);break;
            case '2' :show();break;
            case '3':system("cls");cout<<"Введите фамилию больного"<<endl; cin>>ctr; dop(f,ctr);break;
            case '4':system("cls");cout<<"Введите фамилию больного"<<endl; cin>>str;search(str);break;
            case '0' : return 0;
            default : cout<<" error ";return 0;
        }
    }
    system("pause");
}
 
void input (FILE *f)
{
    ifstream F;
    lol zp;
    char filename[30];
    f = fopen("base.dat","wb");
    printf("\nВведите имя файла с данными\n");
    scanf("%s", filename);
    F.open (filename, ios::in);
    if(!F.is_open()){ 
		cout<<"can't open this file\n";}
    while (true)
    {
        F >> zp.FIO;
        if (!F) break;
        F >> zp.diz;
        F >> zp.post;
        F >> zp.pol;
        fwrite(&zp, sizeof(zp), 1, f);
    }
    fclose(f);
    F.close();
}
 
void show ()
{
    int i;
    system("cls");
    f=fopen("base.dat","rb");
    i=1;
    printf("\n   --------------------------------------------------\n");
    printf("   |    ФИО    |   Диагноз    |Пол|  Дата поступления |\n");
    printf("   ------------+--------------+---+-------------------\n");
    
    while (fread(&zp, sizeof(zp), 1, f))
    { 
        printf("%3d   %3s        %4s         %c          %3d", i, zp.FIO, zp.diz, zp.pol, zp.post);
        printf("\n   --------------------------------------------------\n");
        i++;
    }
    i=0;
    getch();
}
void dop (FILE *f,char* n)
{   int p,m;
	lol sp[10000];
	lol dp;
    system("cls");
    setlocale(LC_ALL,"Rus");
	char* r =zp.FIO;
	p=0;
	f=fopen("base.dat","rb");
    while (!feof(f))
    {fread(&zp,sizeof(lol),1,f);
     sp[p]=zp;
     p=p+1;
    }
	int i=0;
	f=fopen("base.dat","wb");
	while (fread(&zp, sizeof(zp),1,f))
    {char* r =zp.FIO;
	if (strcmp(n,r) == 0){m=i;}
	i=i+1;}
	printf("\n Введите информацию о пациенте \n");
    printf("\n ФИО: ");
    scanf("%s",dp.FIO);
    printf("Диагноз: ");
    scanf("%s",&dp.diz);
    printf("Пол: ");
    scanf("%s",&dp.pol);
    printf ("Дата поступления: ");
    scanf("%d",&dp.post);
	for (int i=10001;i>=m+1;i--)
	{sp[i+1]=sp[i];
	sp[m+1]=dp;
	}
	for (int i=0;i<=p+1;i++)
	{fwrite(&sp[i],sizeof(lol),1,f);
	}
	}
void search (char* n)
    {f=fopen("base.dat","rb");
    while (fread(&zp, sizeof(zp),1,f))
    {char* r =zp.FIO;
    if (strcmp(n,r)==0)
    { printf(" %s    %s   %s    %3d",zp.FIO,zp.diz,zp.pol,zp.post);
    printf("      \n--------------------------------------------------\n");
    }
    }
    fclose(f);
    getch();
}
Grizzz вне форума   Ответить с цитированием
Старый 27.09.2013, 01:33   #2
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

Исклчительная ситуация?
Напишите, пожалуйста, какую ошибку выдает компилятор.
Igor95 вне форума   Ответить с цитированием
Старый 27.09.2013, 02:08   #3
kineziz
Форумчанин
 
Регистрация: 22.12.2011
Сообщений: 378
По умолчанию

Код:
for (int i=10001;i>=m+1;i--)
{
	sp[i+1]=sp[i];
	sp[m+1]=dp;
}
Вроде тут выход за пределы массива. У вас переменная sp имеет размер в 10000 элементов, а начальный индекс у вас 10001. Индексация данной переменной не должна превышать значения на отрезке [0;SIZE - 1], где SIZE - размер массива. Поэтому и выдает исключение.

Да и кстати, вот такие вещи i=i+1 лучше записывать как ++i. И еще на будущее: Учитесь пользоваться отладчиком. Для вас он должен быть лучшим другом
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования.

Последний раз редактировалось kineziz; 27.09.2013 в 02:15.
kineziz вне форума   Ответить с цитированием
Старый 30.09.2013, 15:47   #4
Grizzz
 
Регистрация: 10.10.2012
Сообщений: 5
По умолчанию

kineziz
вот вроде переделал процедуру но все равно ошибка какая то
Код:
void dop (FILE *f,char* n)
{ f=fopen("base.dat","rb");
int sizef,poz,m;
lol zp[10000],dp,dp1;
sizef=0;
fseek(f,0,SEEK_END);
sizef=ftell(f);
fseek(f,0,SEEK_SET);
if (sizef==0) 
{cout<<"Файл пуст"<<endl;
}
poz=sizef/sizeof(lol);
for(int i=0;i<poz;++i)
{fread(&dp,sizeof(lol),1,f);
 char* r =dp.FIO;
 if (strcmp(n,r)==0){m=i;}
 zp[i]=dp;
}
	printf("\n Введите информацию о пациенте \n");
    printf("\n ФИО: ");
    scanf("%s",dp1.FIO);
    printf("Диагноз: ");
    scanf("%s",&dp1.diz);
    printf("Пол: ");
    scanf("%s",&dp1.pol);
    printf ("Дата поступления: ");
	scanf("%d",&dp1.vozr);
for (int i=poz;i>m+1;i++)
{zp[i+1]=zp[i];}
zp[m+1]=dp1;
++poz;
for (int i=0;i<poz;i++) {fwrite(&zp[i],sizeof(lol),1,f);}
}
Grizzz вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
в чем может быть ошибка? Imposters Общие вопросы .NET 4 23.11.2012 14:11
Не проходит дебаг, в чем может быть ошибка? L6go1as Win Api 14 07.01.2012 18:33
В чем может быть ошибка? nervniy БД в Delphi 2 21.10.2010 15:47
помотрите в чем может быть ошибка zizu Помощь студентам 2 26.04.2010 10:16
чем может быть вызвана эта ошибка doncova1 Общие вопросы Delphi 5 01.03.2007 12:15


14:05.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.