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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вывод из файла структуры. 
V
    Опции темы
toxx
Дата 19.4.2009, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Хотел опробовать средства fread fwrite.Нашел программу базы данных, ввод работает нормально, а вывод косячит почемуто...(выводит только 1 запись,при наличии в файле допустим 3х).Никак не пойму почему.Просмотрел имеющиеся темы, попробовал вывод переписать из других тем(не помогло).
Функция вывода из файла.
Код

void print(FILE *f)
{clrscr();
 int i;
 char name[10];
 struct Personal sotr;
 printf("Vvedite imy faila: ");
 scanf("%s",name);
 f=fopen(name,"r");
 while (!feof(f))
 {
  fread(&sotr, sizeof(sotr),1,f);
  printf("%s %s %s %s ",sotr.fio, sotr.data, sotr.dolgn, sotr.zp);
 }
 fclose(f);
 getch();
 }


Сама программа

Код

#include <stdio.h>
#include <conio.h>

struct Personal
  {char fio[25];
   char data[20];
   char dolgn[20];
   char zp[10];
  };

void menu();
void create(FILE *,int );
void print(FILE *);
void dozapis(FILE *,int );
void correct(FILE *);
int len(FILE *);

void main()
{int vybor,n,l;
 FILE *f;
 do{
clrscr();
menu();
printf("Vash vybor: ");
scanf("%d",&vybor);
 switch (vybor){
  case 1:printf("Vvedite kol-vo sotrudnicov: ");
     scanf("%d",&n);
     create(f,n);break;
  case 2:print(f);break;
  case 3:correct(f);break;
  case 4: printf("Vvedite kol-vo sotrudnicov: ");
    scanf("%d", &n);
    dozapis(f,n);break;
  case 5:break;
  case 6:l=len(f); printf("%d",l);break;
  default :puts("\n Nevernyi vvod.Vvedite chislo ot 1 do 5 ");
  }
  }while (vybor!=5);
}

void menu(void)
{puts("\t Menu");
 puts("1.Sozdat fail. \n");
 puts("2.Prosmotr faila. \n");
 puts("3.Izmenit fail. \n");
 puts("4.Dozapis v fail. \n");
 puts("5.Vyxod. \n");
}


void create(FILE *f,int n)
{clrscr();
 int i;
 char name[10];
 struct Personal sotr;
 printf("Vvedite imy sozdavaemogo faila: ");
 scanf("%s",name);
 if((f=fopen(name,"w"))==NULL)
  {printf("Ne udaetsy otkryt fail na zapis.\n");
  }
  for (i=0;i<n;i++)
   {clrscr();
 printf("Vvedite svedeniy o %d sotrudnike:\n",i+1);
 printf("F.I.O.:\n");
 scanf("%s",sotr.fio);
 printf("Data rogdeniy:\n");
 scanf("%s",sotr.data);
 printf("Dolgnost:\n");
 scanf("%s",sotr.dolgn);
 printf("Zarplata:\n");
 scanf("%s",sotr.zp);
 fwrite(&sotr, sizeof(sotr),1,f);
   }
  fclose(f);
 }


void print(FILE *f)
{clrscr();
 int i;
 char name[10];
 struct Personal sotr;
 printf("Vvedite imy faila: ");
 scanf("%s",name);
 f=fopen(name,"r");
 //for (i=0;i<n;i++)
 //fread(&sotr, sizeof(sotr),1,f);
 while (!feof(f))

 {fread(&sotr, sizeof(sotr),1,f);
  printf("%s %s %s %s ",sotr.fio, sotr.data, sotr.dolgn, sotr.zp);
  //fread(&sotr, sizeof(sotr),1,f);
 }
 fclose(f);
 getch();
 }


void dozapis(FILE *f,int n)
{clrscr();
 struct Personal sotr;
 int i;
 char name[10];
 printf("Vvedite imy faila na dozapis: ");
 scanf("%s",name);
 if((f=fopen(name,"a"))==NULL)
  {printf("Ne udaetsy otkryt fail na zapis.\n");
  }
 for (i=0;i<n;i++)
 {printf("Vvedite svedeniy o %d sotrudnike:\n",i+1);
 printf("F.I.O.:\n");
 scanf("%s",sotr.fio);
 printf("Data rogdeniy:\n");
 scanf("%s",sotr.data);
 printf("Dolgnost:\n");
 scanf("%s",sotr.dolgn);
 printf("Zarplata:\n");
 scanf("%s",sotr.zp);
 fwrite(&sotr, sizeof(sotr),1,f);
   }
  fclose(f);

}
 void correct(FILE *f)
 {char name[10],fam[25];
  int v,l;
  struct Personal sotr;
  printf("Vvedite imy faila: ");
  scanf("%s",name);
  if((f=fopen(name,"r+"))==NULL)
  {printf("Ne udaetsy otkryt fail na zapis.\n");
  }
  printf("Vvedite familiu sotrudnika dly correctirovki: ");
  scanf("%s", &fam);
  while(!feof(f))
  {fread(&sotr, sizeof(sotr),1,f);
 if(!strcmp(fam,sotr.fio))
  {l++;
   fseek(f,sizeof(sotr),SEEK_CUR);
   printf("Chto chotite ispravit:\n 1.Familiu.\n 2.Dolgnost.\n 3.Zarplatu\n");
   printf("Vash vybor: ");
   scanf("%d",&v);
    switch(v)
    {case 1:printf("Vvedite novyu familiu ");
      scanf("%s",&sotr.fio);
      printf("Dannye izmeneny.\n");
      break;
  case 2:fseek(f,(sizeof(sotr.fio)+sizeof(sotr.data)),SEEK_CUR);
      printf("Vvedite novyu dolgnost ");
      scanf("%s",&sotr.dolgn);
      printf("Dannye izmeneny.\n");
      break;
  case 3:fseek(f,(sizeof(sotr.fio)+sizeof(sotr.data)+sizeof(sotr.dolgn)),SEEK_CUR);
      printf("Vvedite novyu zarplatu ");
      scanf("%s",&sotr.zp);
      printf("Dannye izmeneny.\n");
      break;
  default:puts("Nevernyi vvod.\n");
    }
    fclose(f);
  }
 if (l=0) {
  printf("Takogo sotrudnica net");
 }
 getch();
  }
  }

 int len(FILE *f)
 {struct Personal sotr;
  char name[10];
  int l=0;
  printf("Vvedite imy faila: ");
  scanf("%s",name);
   if((f=fopen(name,"r+"))==NULL)
   {printf("Ne udaetsy otkryt fail.\n");
 }
   while(!feof(f))
 {fread(&sotr, sizeof(sotr),1,f);
  l++;
 }
 getch();
 return l;

 }

PM MAIL   Вверх
nubliK
Дата 20.4.2009, 05:28 (ссылка)   | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


вселенские матрицы



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 11.9.2008
Где: Владивосток

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



Исходный твой
Код

while (!feof(f))
 {
  fread(&sotr, sizeof(sotr),1,f);
  printf("%s %s %s %s ",sotr.fio, sotr.data, sotr.dolgn, sotr.zp);
 }


Я привык использовать потоки ввода вывода - поэтому не пинай

Код

string s;
while (getline(f, s))
  cout << s << "\n"


помогло?
PM MAIL ICQ   Вверх
mrbrooks
Дата 20.4.2009, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

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



nubliK, есть подозрение камрад - что автор пишет на С.
PM MAIL   Вверх
zim22
Дата 20.4.2009, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

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



Цитата(nubliK @  20.4.2009,  05:28 Найти цитируемый пост)
fread(&sotr, sizeof(sotr),1,f);


Цитата(nubliK @  20.4.2009,  05:28 Найти цитируемый пост)
while (getline(f, s))

вы считаете, что написали эквивалентный код?



--------------------
PM MAIL   Вверх
toxx
Дата 20.4.2009, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



nubliK

Я сам использую потоки))Поэтому сделал без проблем это задание, а один человек делает через средстава ввода/вывода Си а Си++, отсюда у неё стока гемороя.Я сам попытался вникнуть в эту писанину вродебы все по нормально, на форуме копался нашел варианты вывода из файла не помогло(


mrbrooks
По поводу Си выше))


zim22

Да уж неособо эквивалентный средства разные)
PM MAIL   Вверх
zim22
Дата 20.4.2009, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

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



Цитата(toxx @  20.4.2009,  16:46 Найти цитируемый пост)
Да уж неособо эквивалентный средства разные)

результаты разные. код, предложенный nubliK'ом не читает структуру. он читает строку текста.


--------------------
PM MAIL   Вверх
toxx
Дата 20.4.2009, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



zim22
Да я понимаю, просто хотелосьбы чтобы не потоками было сделано, fread fwrite.Потокамибы ябы сам переписал)А когда делаешь fread fwrite выводит только одну запись из файла при наличии допустим 3х(
PM MAIL   Вверх
zim22
Дата 20.4.2009, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

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



toxx, я могу вам посоветовать упростить программу до "не-могу" и разобраться с простейшим примером. т.е. возьмите и напишите очень простую программу с нуля. разберитесь, как работают функции fread, fwrite


--------------------
PM MAIL   Вверх
toxx
Дата 20.4.2009, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



zim22
Хорошо =)
PM MAIL   Вверх
nubliK
Дата 21.4.2009, 02:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


вселенские матрицы



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 11.9.2008
Где: Владивосток

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



to mrbrooks я это понял. просто проще хотелось.

zim22 - а разве файл не будет текстовый?

Ну раз за потоки отпинали по полной - тогда попробуй из этого примера что нибудь сотворить

Код

#include <stdio.h>

int main()
{
    FILE *fp = fopen("файл.txt", "r");
    int c;
    c = getc(fp);
    while (c != EOF) {
        /* Выводим файл в stdout */
        putchar(c);
        c = getc(fp);
    }
    if (feof(fp))
      puts("Конец файла достигнут.");
    else if (ferror(fp))
      puts("Ошибка чтения из потока.");
    else
      /*НЕДОСТИГНУТ*/
      puts("getc() завершилась с неопознанной ошибкой.");

    fclose(fp);
    return 0;
}


взято здесь  http://ru.wikipedia.org/wiki/Feof 

Код

/* feof example: byte counter */
#include <stdio.h>
int main ()
{
  FILE * pFile;
  long n = 0;
  pFile = fopen ("myfile.txt","rb");
  if (pFile==NULL) perror ("Error opening file");
  else
  {
    while (!feof(pFile)) {
      fgetc (pFile);
      n++;
      }
    fclose (pFile);
    printf ("Total number of bytes: %d\n", n-1);
  }
  return 0;
}


http://www.cplusplus.com/reference/clibrary/cstdio/feof/

Это сообщение отредактировал(а) nubliK - 21.4.2009, 02:44
PM MAIL ICQ   Вверх
nubliK
Дата 21.4.2009, 03:27 (ссылка)   | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


вселенские матрицы



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 11.9.2008
Где: Владивосток

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



И еще! У меня твоя программа заработала легко, но только под Dev-C++ и как то очень странно - в результате она показывает из файла последнюю запись дважды и запрос на дату рождения, должность и заработную плату выплевывает разом, а не последовательно - могу прислать тебе скрин как оно работает.
Я выкинул функцию clrscr() потому что компил(Dev-C++) ругался.  описания ее я так и не нашел в твоем исходнике.
Студия исходник не осилила - почему - понятия не имею (как то они все там лихо стандартизировали и теперь старые функции Си либо не определены либо определены но не в том значении как было раньше).


PM MAIL ICQ   Вверх
toxx
Дата 21.4.2009, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(nubliK @ 21.4.2009,  03:27)
И еще! У меня твоя программа заработала легко, но только под Dev-C++ и как то очень странно - в результате она показывает из файла последнюю запись дважды и запрос на дату рождения, должность и заработную плату выплевывает разом, а не последовательно - могу прислать тебе скрин как оно работает.
Я выкинул функцию clrscr() потому что компил(Dev-C++) ругался.  описания ее я так и не нашел в твоем исходнике.
Студия исходник не осилила - почему - понятия не имею (как то они все там лихо стандартизировали и теперь старые функции Си либо не определены либо определены но не в том значении как было раньше).

Могу сказать еще больше, у того кто писал эту программу, она спрашивает  только первые 2 поля при создании, пользуемся одним компилятором, а результат разный(У меня спрашивает всё, только вывод косячит).Вобщем это чтото не понятное.Человек уже неделю мучается с этим ефом.Конечно попробую что ты нашел,только вродебы пробовали это).Спасибо, что запустил программу.
PM MAIL   Вверх
zim22
Дата 21.4.2009, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

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



Цитата(nubliK @  21.4.2009,  02:22 Найти цитируемый пост)
а разве файл не будет текстовый?

это похоже на считывание текста? подсказка: это считывание в бинарном режиме структуры.
Код

fread(&sotr, sizeof(sotr),1,f); 
printf("%s %s %s %s ",sotr.fio, sotr.data, sotr.dolgn, sotr.zp);




--------------------
PM MAIL   Вверх
Dov
Дата 21.4.2009, 19:19 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

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



Б-ррррр, кошмар какой...  Даже не знаю с чего начать... Ладно, сделаем так.
toxx, вот тебе примерчик твоей проги в облегчённом виде, разбирайся. Я отметил места, где сделал изменения, остальное ты сам должен понять. 

Скажу только, что если ты спрашиваешь пользователя о количестве записей, то ты должен организовать массив структур, соответсвующего размера.  Я, для примера, взял массив из трёх структур, а тебе,возможно, прийдётся  динамически создавать. 
Код

struct Personal
{
    char    fio[25];
    char    data[20];
    char    dolgn[20];
    char    zp[10];
};

void    menu();
void    create( FILE *, int );
void    print( FILE * );

void main()
{
    int        vybor, n, l;
    FILE   *f;

    do
    {
        menu();
        printf( "Vash vybor: " );
        scanf( "%d", &vybor );

        switch( vybor )
        {
        case 1:
            //printf( "Vvedite kol-vo sotrudnicov: " );
            //scanf( "%d", &n );
            n = 3;
            create( f, n );break;
        case 2:
            print( f );break;
        default :
            puts( "\n Nevernyi vvod.Vvedite chislo ot 1 do 5 " );
        }
    }while( vybor != 5 );
}

void menu( void )
{
    puts( "\t Menu" );
    puts( "1.Sozdat fail. \n" );
    puts( "2.Prosmotr faila. \n" );
}


void create( FILE *f, int n )
{
    int                i;
    char            name[10];

    struct Personal    sotr[3];                  // <<==

    printf( "Vvedite imy sozdavaemogo faila: " );
    scanf( "%s", name );

    if( ( f = fopen( name, "wb" ) ) == NULL ) // <<==
    {
        printf( "Ne udaetsy otkryt fail na zapis.\n" );
    }

    for( i = 0; i < n; i++ )
    {
        printf( "Vvedite svedeniy o %d sotrudnike:\n", i + 1 );
        printf( "F.I.O.:\n" );              
        scanf( "%s", sotr[i].fio );           // <<== 
        printf( "Data rogdeniy:\n" );
        scanf( "%s", sotr[i].data );          // <<==
        printf( "Dolgnost:\n" );
        scanf( "%s", sotr[i].dolgn );         // <<==
        printf( "Zarplata:\n" );
        scanf( "%s", sotr[i].zp );            // <<==
    }

    fwrite( &sotr, sizeof( Personal ), 3, f );// <<== 

    fclose( f );
}


void print( FILE *f )
{
    int                i;
    char            name[10];

    struct Personal    sotr[3];                  // <<==

    printf( "Vvedite imy faila: " );
    scanf( "%s", name );

    f = fopen( name, "rb" );//                // <<==

    fread( &sotr, sizeof( Personal ), 3, f ); // <<==

    for(i = 0; i < 3; i++ )                   // <<==
    {
        printf( "%s %s %s %s \n", sotr[i].fio, sotr[i].data, sotr[i].dolgn, sotr[i].zp ); // <<==
    }

    fclose( f );
    getch();
}


Это сообщение отредактировал(а) Dov - 21.4.2009, 19:19


--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
toxx
Дата 21.4.2009, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Dov
Спасибо за проделанную работу.

f = fopen( name, "rb" )

Проблема была в том как открыт файл.Спасибо, всё понятно=)

Это сообщение отредактировал(а) toxx - 21.4.2009, 22:06
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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