1

Тема: допоможіть з редагуванням

ця підпрограмма редагує тільки 1 запис а інші не торкається
допоможіть мені це полагодити
на приклад:
товар          ціна
lg               1300
samsung      3000
відредагується тільки lg та 1300

void per()
{ FILE *fz,*ft,*fs,*fd;
int flag,v,c=1,i=1;
long int kol;
   char buf[256],cp[13];
   clrscr();
   if ((ft=fopen("skidki.dat","r+b"))==0) {cout<<endl<<"недостатньо інформаціі";getch();}
   else  if((fs=fopen("tov.dat","r+b"))==NULL) {cout<<endl<<"недостатньо інформаціі";getch();}
   else  if((fz=fopen("zakazi.dat","r+b"))==NULL) {cout<<endl<<"недостатньо інформаціі";getch();}
   else   if((fd=fopen("dost.dat","r+b"))==NULL) {cout<<endl<<"недостатньо інформаціі";getch();}
   else
   {
    fclose(ft);
    fclose(fs);
    fclose(fd);
    fclose(fz);
    fz=fopen("zakazi.dat","r+b");
    ft=fopen("znuwku.dat","rb");
    fs=fopen("tov.dat","rb");
    fd=fopen("dost.dat","rb");
    kol=sizeof(mag);
    fread(&mag,sizeof(mag),1,fz);
    fread(&tov,sizeof(tov),1,fs);
    while(!feof(fz))
    {
     rewind(fs);
   fread(&tov,sizeof(tov),1,fs);
   while(!feof(fs))
    {
    if (strcmp(tov.nazv,mag.naz)==0) {
                     mag.st=tov.zena;
                     }
     fread(&tov,sizeof(tov),1,fs);

    }
    fd=fopen("dost.dat","rb");
    fread(&dos,sizeof(dos),1,fd);
    if (strcmp(mag.dost,"курьєр")==0)
    {
    mag.st=mag.st+dos.st_k;
    }
    else if (strcmp(mag.dost,"пошта")==0)
    {
      mag.st=mag.st+dos.st_p;
       }
    else {
       mag.st=mag.st+dos.st_s;
    }
    rewind(ft);
     fread(&ski,sizeof(ski),1,ft);
     while(!feof(ft))
     {
     if((mag.d>=ski.d_n)&&(mag.d<=ski.d_k)) flag=1;
     if ((mag.m>=ski.m_n)&&(mag.m<ski.m_k)) flag=1;
     if ((mag.g>=ski.g_n)&&(mag.g<=ski.g_k)) flag=1;
     if (flag) { mag.skid=ski.proc;
        }
      fread(&ski,sizeof(ski),1,ft);
      }
       if (strcmp(mag.tal,"є")==0) flag=1;
       else { flag=0; mag.st=mag.st-(mag.st/100)*mag.skid;}
      if (flag) {

          if (flag) mag.st=mag.st-(mag.st/100)*5;
            }
         fseek(fz,-kol,1);
         fwrite(&mag,sizeof(mag),1,fz);
         fread(&mag,sizeof(mag),1,fz);
         }

   }
   fclose(fz);
   fclose(fd);
   fclose(ft);
   fclose(fs);
}

2

Re: допоможіть з редагуванням

1. Поясніть будь-ласка, нащо відкривати файли, потім їх закривати, потім відкривати знову? (в чому шаманство)
2. Чому Ви не використовуєте зрозумілих імен змінних?
3. Що таке "mag" і де воно оголошується?

3

Re: допоможіть з редагуванням

1.в мене вже нервовий тик бо я вже 3 дні роблю цю функцію
2.Кому як=) Я ж не збираюсь її продавати(можу пояснити що кожна змінна означає)
3.mag -це структура
struct magaz
       { char fio[13];
       char tal[6] ;
       char naz[15] ;
       char dost[10];
    float st,d,m,g,skid;

    }mag;
tal-талон
fio-прізвищє ім`я по батькові
naz-назва товару
dost-тип доставки
st_ціна
d_день
m_місяць
g_рік
skid_процент знижки

4

Re: допоможіть з редагуванням

А ski?

5

Re: допоможіть з редагуванням

struct dost
    { float st_s;
    float st_k;
    float st_p;
    float cdost;
    }dos;

    struct zniski
    {      float d_n,m_n,g_n,d_k,m_k,g_k,proc;
    }ski;

     struct tovari
     { char nazv[15];
       float zena;
       }tov;

6 Востаннє редагувалося Chemist-i (13.11.2013 00:26:53)

Re: допоможіть з редагуванням

Ну, я не розбирався в Вашому коді, бо це адський ад сотони а просто відформатував, щоб Ви побачили, логіку програми, я думаю ви зразу зрозумієте, що за чим виконується.

void per()
{
    FILE *fz,*ft,*fs,*fd;
    int flag,v,c=1,i=1;
    long int kol;
    char buf[256], cp[13];
    clrscr();
    if ( (ft=fopen("skidki.dat","r+b"))==0 ) 
    {
        cout<<endl<<"недостатньо інформаціі";
        getch();
    }
    else
        if( (fs=fopen("tov.dat","r+b"))==NULL ) 
        {
            cout<<endl<<"недостатньо інформаціі";
            getch();
        }
        else
            if( (fz=fopen("zakazi.dat","r+b"))==NULL ) 
            {
                cout<<endl<<"недостатньо інформаціі";
                getch();
            }
            else
                if ( (fd=fopen("dost.dat","r+b"))==NULL )
                {
                    cout<<endl<<"недостатньо інформаціі";
                    getch();
                }
                else
                {
                    fclose(ft);
                    fclose(fs);
                    fclose(fd);
                    fclose(fz);
                    fz=fopen("zakazi.dat","r+b");
                    ft=fopen("znuwku.dat","rb");
                    fs=fopen("tov.dat","rb");
                    fd=fopen("dost.dat","rb");
                    kol=sizeof(mag);
                    fread(&mag,sizeof(mag),1,fz);
                    fread(&tov,sizeof(tov),1,fs);
                    
                    while(!feof(fz))
                    {
                        rewind(fs);
                        fread(&tov,sizeof(tov),1,fs);
                        while(!feof(fs))
                        {
                            if (strcmp(tov.nazv,mag.naz)==0) 
                            {
                                mag.st=tov.zena;
                            }
                            fread(&tov,sizeof(tov),1,fs);
         
                        }
                        fd=fopen("dost.dat","rb");
                        fread(&dos,sizeof(dos),1,fd);
                        if (strcmp(mag.dost,"курьєр")==0)
                        {
                            mag.st=mag.st+dos.st_k;
                        }
                        else
                            if (strcmp(mag.dost,"пошта")==0)
                            {
                                mag.st=mag.st+dos.st_p;
                            }
                            else
                            {
                                mag.st=mag.st+dos.st_s;
                            }
                        
                        rewind(ft);
                        fread(&ski,sizeof(ski),1,ft);
                        while(!feof(ft))
                        {
                            if ( (mag.d>=ski.d_n)&&(mag.d<=ski.d_k) ) flag=1;
                            if ( (mag.m>=ski.m_n)&&(mag.m<ski.m_k) ) flag=1;
                            if ( (mag.g>=ski.g_n)&&(mag.g<=ski.g_k) ) flag=1;
                            
                            if (flag)
                            {
                                mag.skid=ski.proc;
                            }
              
                            fread(&ski,sizeof(ski),1,ft);
                        }
                        
                        if (strcmp(mag.tal,"є")==0) flag=1;
                        else 
                        {
                            flag=0;
                            mag.st=mag.st-(mag.st/100)*mag.skid;
                        }
                        
                        if (flag)
                        {
                            if (flag) mag.st=mag.st-(mag.st/100)*5;
                        }
                 
                        fseek(fz,-kol,1);
                        fwrite(&mag,sizeof(mag),1,fz);
                        fread(&mag,sizeof(mag),1,fz);
                    }
         
                }
        
    fclose(fz);
    fclose(fd);
    fclose(ft);
    fclose(fs);
}

7 Востаннє редагувалося Chemist-i (13.11.2013 00:40:18)

Re: допоможіть з редагуванням

І прочитайте будь-ласка це: http://replace.org.ua/post/16414/#p16414

Зокрема:

koala написав:

В новачків часто виникає ілюзія, що довгі назви важко набирати; тут слід зрозуміти, що абсолютну більшість роботи програміст робить в голові, а час на набір коду - це дрібниця порівняно із часом на читання коду. Необхідність десять разів переглядати весь код назад, щоб згадати, що x - це перша літера, а y - висота вокзалу, повністю з'їдають економію від написання три рази pershaLitera і чотири vysotaVokzalu.
В ідеалі код має бути таким, щоб сам код читався, як коментар до коду.

8

Re: допоможіть з редагуванням

=) я вже в голові побудував все але з кодовою частиною в мене не виходить

9

Re: допоможіть з редагуванням

Я думаю що проблема тут:

  fseek(fz,-kol,1);
  fwrite(&mag,sizeof(mag),1,fz);
  fread(&mag,sizeof(mag),1,fz);

Тому що після цього коду виконується перевірка

while(!feof(fz))

Яка повертає фалс і виходить, не записавши останнього запису.

fwrite(&mag,sizeof(mag),1,fz);

Має бути в самому кінці.

10 Востаннє редагувалося valera220396 (13.11.2013 01:10:18)

Re: допоможіть з редагуванням

ось більш зрозумілий код
усі записи повинні збільшитись на 100 але збільшується тільки 1

void pererahuvannya()
{
FILE  *ftov;

int kol,c=1;

clrscr();

ftov=fopen("tov.dat","r+b");

fread(&tov,sizeof(tov),1,ftov);

rewind(ftov);

while(!feof(ftov))

    {
         tov.zena+=100;

         fseek(ftov,(c-1)*sizeof(tov),1);

         fwrite(&tov,sizeof(tov),1,ftov);
         c++;
         fread(&tov,sizeof(tov),1,ftov);


   }
   fclose(ftov);
}

11

Re: допоможіть з редагуванням

А отак не можна?

void pererahuvannya()
{
    FILE  *ftov;
    int kol,c=1;
    clrscr();
    ftov=fopen("tov.dat","r+b");
    rewind(ftov); 
    
    while(!feof(ftov))
    {
        fread(&tov,sizeof(tov),1,ftov);
         
        tov.zena+=100;
 
        fseek(ftov,(c-1)*sizeof(tov),1);
 
        fwrite(&tov,sizeof(tov),1,ftov);
        c++;
        //fread(&tov,sizeof(tov),1,ftov);
   }
   fclose(ftov);
}

12

Re: допоможіть з редагуванням

ні вона создає безкінечний цикл запису в файл

13 Востаннє редагувалося valera220396 (13.11.2013 01:38:15)

Re: допоможіть з редагуванням

упс я не  дуже уважно подивився текст, тепер программа перезаписує з 1 запису в 2 назву товару и просто до її ціни добавляє 100

14

Re: допоможіть з редагуванням

Трохи через дупу, але так:

//створюю файл
void create_base()
{
     int a = 0;
    
    struct tovari
    {
        char nazv[15];
          float zena; //float
    }tov;  
    
    FILE  *ftov;
    int kol,c=1;
    //clrscr();
        ftov = fopen("C:\\tov.dat","w+");
 
    //fseek(ftov,(c-1)*sizeof(tov),1);   
    rewind(ftov); 
   
    tov.zena = 10;
        tov.nazv[0] = 's';
    tov.nazv[1] = 'a'; 
    fwrite(&tov,sizeof(tov),1,ftov);

    tov.zena = 20;
        tov.nazv[0] = 'l';
    tov.nazv[1] = 'g'; 
    fwrite(&tov,sizeof(tov),1,ftov);

    tov.zena = 30;
        tov.nazv[0] = 'v';
    tov.nazv[1] = 'i'; 
    fwrite(&tov,sizeof(tov),1,ftov);

    fclose(ftov);
}

//перезаписую по одній
void pererahuvannya()
{
     struct tovari
    {
        char nazv[15];
          float zena;
    }tov;  
    
    FILE  *ftov;
    int kol,c=1;
    //clrscr();
    ftov=fopen("C:\\tov.dat","r+");
 
    rewind(ftov); 
    while( 1 )
    {
        if ( fread(&tov,sizeof(tov),1,ftov) <= 0 ) break;  
        tov.zena += 100;

        int offset = ftell(ftov) - sizeof(tov);
        fseek(ftov, offset, 0);
        fwrite(&tov, sizeof(tov), 1, ftov);
        
        offset = ftell(ftov) + sizeof(tov)*0;
        fseek(ftov, offset, 0);
    }
    

    rewind(ftov);
    while( 1 )
    {
        if ( fread(&tov, sizeof(tov), 1, ftov) <= 0 )
            break;
        else
            printf("%s - %f;\n", tov.nazv, tov.zena);

    }
    fclose(ftov);
}

void main(char* args[])
{
    create_base();
    pererahuvannya();
}

15

Re: допоможіть з редагуванням

Останній параметр у виклику

fseek(ftov,(c-1)*sizeof(tov),1);

означає "зміститися відносно поточного положення в файлі". Використовуйте константи SEEK_SET і SEEK_CUR, щоб не плутатися.
Тобто вам треба викинути змінну c і робити

fseek(ftov,-sizeof(tov),SEEK_CUR);

16

Re: допоможіть з редагуванням

діло в том що коли я використовую -sizeof(tov),seek_cur то в мене записується лабуда

17 Востаннє редагувалося koala (13.11.2013 10:26:39)

Re: допоможіть з редагуванням

А можете показати, як ви їх використовуєте?
Тут взагалі є два рішення - або використовувати SEEK_SET і лічільник c, або SEEK_CUR і -sizeof(tov). Якщо ви принципово за перше, то просто поставте SEEK_SET замість 1 і все має запрацювати. Але правильніше тут, н.м.д., друге.

18

Re: допоможіть з редагуванням

Дякую за підтримку народ, я вже вирішив цю задачу, не знаю як мені це рішення прийшло в голову але вирішив
ось код кому інтересно):

void per()
{
FILE  *ftov;

int kol;

clrscr();
 ftov=fopen("tov.dat","r+b");
     kol=sizeof(tov);
     fread(&tov,kol,1,ftov);
     while(!feof(ftov))
     {
     tov.zena=tov.zena+100;
     fseek(ftov,-kol,1);
     fwrite(&tov,sizeof(tov),1,ftov);
     fseek(ftov,kol,kol);
     fread(&tov,sizeof(tov),1,ftov);
    }
   fclose(fs);
}

19

Re: допоможіть з редагуванням

 fseek(ftov,kol,kol);

Це повний UB... Гадаю, працює тільки тому, що через незрозумілий параметр цей рядок ігнорується.

20

Re: допоможіть з редагуванням

лол без цього параметру вона не хоче робити, а якщо робе то не правильно