Форум: Форум C++Разное
Новые темы: 00
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум C++

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Поменять местами в файле записи
 
 автор: AI\EKCAH^P   (29.05.2009 в 19:24)   письмо автору
 
 

Используя функции и режим меню, создать файл из 10 структур, просмотреть файл, добавить в файл новую информацию , применяя режим прямого доступа.
Структура имеет вид: фамилия спортсмена, его номер, количество набранных очков. Поменять местами в файле записи о первых двух спортсменах.
Все сделал, а как поменять местами в файле записи о первых двух спортсменах понятия не имею. Помогите кто может. Заранее благодарен.
#include<stdio.h>
#include<conio.h>
#include<string.h>
 
struct sport{char name[10];int number;int kol;}sp;
void input(FILE *);
void print(FILE *);
void app(FILE *);
void find(FILE *);
main()
 { char c;
 FILE *tf;
 while (1)
 {
 puts("1-novuy fail");
 puts("2-prosmotr faila");
 puts("3-dobavlenie v fail");
 puts("4-poisk i izmenenie");
 puts("0-vyhod");
 c=getch();
 switch(c)
 {case '1':input(tf); break;
  case '2':input(tf);break;
  case '3':input(tf);break;
  case '4':input(tf);break;
  case '0':input(tf);break;
  default : puts("nevernuy regim");
  }
  }
  }
  void input(FILE *tf)
   {char ch;
   tf=fopen("FILE1.dat","wb");
   printf("\n vvedite informaciu o sportcmene \n");
   do
   { printf("\n familiya: "); scanf("%s",sp.name);
   printf(" nomer: "); scanf("%d",&sp.number);
   printf(" kolichestvo ochkov: "); scanf("%d",&sp.kol);
   fwrite(&sp,sizeof(sp),1,tf);
   printf("\n Zakonchity ? y/n");
   ch=getch();
   }
   while (ch != 'y');
   fclose(tf);
   }
   void print(FILE*tf)
   { int i; 
   tf=fopen("file.dat","rb");
   i=1;
   fread(&sp,sizeof(sp),1,tf);
   while(!feof(tf))
   {printf("\n %3d familiya %10s number %6d kolichestvo ochkov %4d ",i,sp.name,sp.number,sp.kol);
   fread(&sp,sizeof(sp),1,tf);
   i++;
   }
   getch();
   }
   void app(FILE *tf)
   {char ch;
   tf=fopen("file1.dat","ab");
   printf("\n vvedite informaciu o sportcmene \n");
   do
   { printf("\n familiya: "); scanf("%s",sp.name);
   printf(" nomer: "); scanf("%d",&sp.number);
   printf(" kolichestvo ochkov: "); scanf("%d",&sp.kol);
   fwrite(&sp,sizeof(sp),1,tf);
   printf("\n Zakonchity ? y/n");
   ch=getch();
   }
   while (ch != 'y');
   fclose(tf);
   }
   void FIND(FILE*tf)
   {char c, sport[10];
   long int i;
   tf=fopen("file1.dat","rb+");
   puts(" Familiya sportcmena: ");
   gets(sport);
   fread(&sp,sizeof(sp),1,tf);
   while (!feof(tf))
   {if (strcmp(sp.name,sport)==0)
   {printf(" familya %10s number %6.2d kolichestvo ochkov %d",sp.name,sp.number,sp.kol);
   printf("/n Izmenity ? y/n");
   c=getch();
   if (c=='y')
   {printf("\n kolichestvo: "); scanf("%d",&sp.kol);
   printf("\n number: "); scanf("%d",&sp.number);
   i=sizeof(sp);
   fseek(tf,-i,1);
   fwrite(&sp,sizeof(sp),1,tf);
   }
   }
   fread(&sp,sizeof(sp),1,tf);
   }
   fclose(tf);
   }
   

  Ответить  
 
 автор: GeorgeIV   (01.06.2009 в 11:28)   письмо автору
 
   для: AI\EKCAH^P   (29.05.2009 в 19:24)
 

Не совсем понятно меню - что не выбираешь, попадаешь в одну и ту же ф-цию.
В чем разница функций input и app?
В каком месте должна быть замена записей?

  Ответить  
 
 автор: AI\EKCAH^P   (01.06.2009 в 11:48)   письмо автору
 
   для: AI\EKCAH^P   (29.05.2009 в 19:24)
 

INPUT-СОЗДАНИЕ ФАЙЛА
APP-ДОБАВЛЕНИЕ В ФАЙЛ
Подскажите как поменять местами в файле записи первых двух спортсменов.
Я думаю,что сначало надо
считывать 1-го спортсмена. Считывать 2-го. Возвращать указатель к первому (fseek). Писать данные о втором. Писать данные о первом (т.к. указатель уже сместился ко второму). А как это написать незнаю. Помоги.

  Ответить  
 
 автор: GeorgeIV   (01.06.2009 в 12:00)   письмо автору
 
   для: AI\EKCAH^P   (01.06.2009 в 11:48)
 

По коду обе функции различаются лишь одним символом, как то нецелесообразно их разделять.
Нелогично используете указатель на файл. Объявляете его без инициализации в основном теле и этот неинициализированный указатель передаете дальше. Зачем? Он в каждой функции используется локально, там можно его и объявлять.
Логика в целом верная. Ща код накидаю

  Ответить  
 
 автор: GeorgeIV   (01.06.2009 в 12:29)   письмо автору
 
   для: GeorgeIV   (01.06.2009 в 12:00)
 

Примерно так:
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include "locale.h"
 
struct sport
{
char name[10];
int number;
int kol;
}sp;
void input();
void print();
void app();
void findsport();
void smena();

 int main()
 { 
char c = 'a';
setlocale(LC_ALL,"Russian");
    while (c!='0')
    {
       puts("1-novuy fail");
       puts("2-prosmotr faila");
       puts("3-dobavlenie v fail");
       puts("4-poisk i izmenenie");
       puts("5-Смена спортсмена");
       puts("0-vyhod");
       c = getch();
       switch(c)
       {
          case '1':input(); break;
          case '2':print();break;
          case '3':app();break;
          case '4':findsport();break;
          case '5':smena();break;
          case '0':break;
          default : puts("nevernuy regim");
       }
      }
  }

  void input()
  {
  char ch;
  int res=0;
      FILE *tf=fopen("file1.dat","wb");
      printf("\n vvedite informaciu o sportcmene \n");
      do
      { 
  printf("\n familiya: "); 
  scanf("%s",sp.name);
          printf(" nomer: "); 
  scanf("%d",&sp.number);
          printf(" kolichestvo ochkov: "); 
  scanf("%d",&sp.kol);
          res = fwrite(&sp,sizeof(sp),1,tf);
          printf("\n Zakonchity ? y/n");
          ch=getch();
       }while (ch != 'y');
       fclose(tf);
   }
   
  void app()
  {
  char ch;
      FILE *tf=fopen("file1.dat","ab");
      printf("\n vvedite informaciu o sportcmene \n");
      do
      { 
  printf("\n familiya: "); 
  scanf("%s",sp.name);
          printf(" nomer: "); 
  scanf("%d",&sp.number);
          printf(" kolichestvo ochkov: "); 
  scanf("%d",&sp.kol);
          fwrite(&sp,sizeof(sp),1,tf);
          printf("\n Zakonchity ? y/n");
          ch=getch();
       } while (ch != 'y');
       fclose(tf);
  }
   
  
  void print()
  { 
  int i; 
      FILE *tf=fopen("file1.dat","rb");
      i=1;
      fread(&sp,sizeof(sp),1,tf);
  printf("\n \tfamiliya \tnumber \tkolichestvo ochkov ");
      while(!feof(tf))
      {
  printf("\n %3d \t%10s  \t%6d  \t%4d ",i,sp.name,sp.number,sp.kol);
          fread(&sp,sizeof(sp),1,tf);
          i++;
      }
      getch();
  printf("\n");
  fclose(tf);
   }
   
  void findsport()
  {
  char c, sport[10];
      long int i;
      FILE *tf=fopen("file1.dat","rb+");
      puts(" Familiya sportcmena: ");
      gets(sport);
      fread(&sp,sizeof(sp),1,tf);
      while (!feof(tf))
      {
  if (strcmp(sp.name,sport)==0)
          {
  printf(" familya %10s number %6.2d kolichestvo ochkov %d",sp.name,sp.number,sp.kol);
              printf("/n Izmenity ? y/n");
              c=getch();
              if (c=='y')
              {
  printf("\n kolichestvo: "); 
  scanf("%d",&sp.kol);
                  printf("\n number: "); 
  scanf("%d",&sp.number);
                  i=sizeof(sp);
                  fseek(tf,-i,1);
                  fwrite(&sp,sizeof(sp),1,tf);
              }
           }
           fread(&sp,sizeof(sp),1,tf);
       }
      fclose(tf);
   }


  void smena()
  {
 struct sport sportsmans[2];

 FILE *tf=fopen("file1.dat","rb+");
 fread(&sportsmans, sizeof(sp), 2, tf);
 fseek(tf,0,SEEK_SET);
 fwrite(&sportsmans[1],sizeof(sp), 1, tf);
 fwrite(&sportsmans[0],sizeof(sp), 1, tf);
     fclose(tf);

  }

  Ответить  
 
 автор: AI\EKCAH^P   (01.06.2009 в 12:32)   письмо автору
 
   для: GeorgeIV   (01.06.2009 в 12:29)
 

Огромное Вам пасибо !

  Ответить  
 
 автор: GeorgeIV   (01.06.2009 в 12:37)   письмо автору
 
   для: AI\EKCAH^P   (01.06.2009 в 12:32)
 

Да на здоровье! :-)
Тем, кто сам пытается разобраться сначала, я помогаю. А тех, кто тупо просит написать за него код, я игнорирую.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования