Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.05.2009, 12:38   #1
ai\ekcah^p
Форумчанин
 
Аватар для ai\ekcah^p
 
Регистрация: 03.05.2009
Сообщений: 112
По умолчанию Используя режим меню создать файл

Помогите пожайлуста исправить программу. Файл вроде создает,а вот просмотр,добавление и изменение никак. Подскажите как поменять местами в файле записи о первых двух спортсменах.Заранее благодарен!
Используя функции и режим меню, создать файл из 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);
   }
ai\ekcah^p вне форума Ответить с цитированием
Старый 29.05.2009, 14:02   #2
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Абсолютно не следите за именами файлов и переменных!

Создаете файл FILE1.dat, добавить пытаетесь в file1.dat, а читаете вообще file.dat.

Подправил. Создание, добавление и чтение работают. Поиск, вроде, тоже, но я не всматривался.
Код:
#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':print(tf);break;
  case '3':app(tf);break;
  case '4':find(tf);break;
  case '0':return 0;
  default : puts("nevernuy regim");
  }
 }
}

//----------
void input(FILE *tf)
{
   char ch;
   tf=fopen("file.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(struct sport),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(struct sport),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(struct sport),1,tf);
    i++;
   }
getch();
}


void app(FILE *tf)
{
char ch;
tf=fopen("file.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("file.dat","r+b");
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);
}
Цитата:
Подскажите как поменять местами в файле записи о первых двух спортсменах
Считываете 1-го спортсмена. Считываете 2-го. Возвращаете указатель к первому (fseek). Пишете данные о втором. Пишете данные о первом (т.к. указатель уже сместился ко второму).
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 29.05.2009, 15:35   #3
ai\ekcah^p
Форумчанин
 
Аватар для ai\ekcah^p
 
Регистрация: 03.05.2009
Сообщений: 112
По умолчанию

Не получается поменять местами первых двух спортсменов.

Код:
void zamena(FILE *);
{
 strcpy(t,sp.name[2]); strcpy(sp.name[2],sp.name[1]); strcpy(sp.name[1],t);
  tf=fopen("file.dat","ab");
  fwrite(name[i],sizeof(name[i]),1,tf);
 }  

fclose(tf);
ai\ekcah^p вне форума Ответить с цитированием
Старый 29.05.2009, 15:38   #4
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Что за sp.name[2]??? Это 3-я буква имени.
Код:
  tf=fopen("file.dat","ab");
Зачем открывать на добавление? Открывайте на чтение+

Посмотрите алгоритм, который я написал выше. Про fseek я не просто так упомянул.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 31.05.2009, 19:44   #5
ai\ekcah^p
Форумчанин
 
Аватар для ai\ekcah^p
 
Регистрация: 03.05.2009
Сообщений: 112
По умолчанию

Посмотрите пожалуйста что я не так сделал.

Код:
  void ZAMENA(FILE*tf)
  {char t;
   fseek(tf,sp.name[1],SEEK_SET);
   fread(&sp,1,sizeof(sp),tf);
   fseek(tf,sp.name[1],SEEK_SET); 
   fwrite(&sp,1,sizeof(sp),tf);
   
   fseek(tf,sp.name[2],SEEK_SET);
   fread(&sp,1,sizeof(sp),tf);
   fseek(tf,sp.name[2],SEEK_SET); 
   fwrite(&sp,1,sizeof(sp),tf);
   
   strcpy(t,sp.name[2]); strcpy(sp.name[2],sp.name[1]); strcpy(sp.name[2],t);
   printf("\n "sp.name);
   }
   fclose(tf);
   }
ai\ekcah^p вне форума Ответить с цитированием
Старый 31.05.2009, 19:50   #6
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

У вас name - массив символов (строка).
Поэтому строчки, подобные этой:
Код:
   strcpy(t,sp.name[2]);
Бессмысленны. Зачем вам копировать 3-ю букву имени?
Дальше. Вот это что?
Код:
  fseek(tf,sp.name[1],SEEK_SET);
Почитайте про параметры, которые принимает fseek.
Для замены вам понадобятся 3 структуры.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создать переход из одной формы в другую используя таблицу и гиперссылку smoky Microsoft Office Access 4 13.05.2009 15:38
как создать меню????? Paul_AG Общие вопросы C/C++ 1 12.04.2009 13:50
можно ли создать стевой режим для игры 18 стальных колёс ТРИУМФ Gamedev - cоздание игр: Unity, OpenGL, DirectX 1 16.05.2008 12:02
Режим ECHO: выкл - бат файл MIGUR Операционные системы общие вопросы 8 13.05.2008 03:31
Полноэкранный режим и главное меню Voland Общие вопросы Delphi 2 03.04.2007 10:56