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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> язык С, структуры 
:(
    Опции темы
МальвинаC
Дата 13.4.2008, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте, столкнулась со следующей проблемой.прошу помочь) Задание: дан файл структур , необходимо упорядочить его по выбранному полю, и переписать уже отсортированный массив структур в этот же файл 
само упорядочивание реализовано в этой программе ,эта программа работает) но нужно её исправить так чтобы структуры не вводились с клавиатуры, а считывались из файла  а потом перезаписывались в этот же файл. 
Вот код:  Очень прошу помочь
Код

#include <stdio.h>
#include <conio.h>
#include <string.h>
struct film
{
char nazvanie[20];
char rejisser[20];
char strana[10];
char god_vipuska[4];
char stoimost[10];
char dohod[10];

}
 av[100];
const int M=100;

int init(void)
{
int i,j,l;
for(i=0;i<M-1;i++)
{printf("Vvedite nazvanie filma\n");
scanf("%s",av[i].nazvanie);
printf("Vvedite god vipuska filma\n");
scanf("%s",av[i].god_vipuska);
printf("Vvedite stoimost filma v tisachax rublei\n");
scanf("%s",av[i].stoimost);
printf("Vvedite rejissera avtomobilia\n");
scanf("%s",av[i].rejisser);
printf("Vvedite stranu proizvoditelya filma \n");
scanf("%s",av[i].strana);
printf("Vvedite dohod filma \n");
scanf("%s",av[i].dohod);
printf("\nEsli vi zakonchili vvodit nazmite 1, inache 0\n");
scanf("%d",&l);
printf("l ravno %i\n",l);
if(l==1){break;}
}
return i;
}
void sortirovka(int r, int w)
{int  i,j,obmen;i=0;
struct film buf;
switch (w)
{ case 1:
do
{i=i+1;
obmen=1;
for (j=r;j>=i;j--)
{if (strcmp(av[j].nazvanie,av[j-1].nazvanie)<0) {buf=av[j];av[j]=av[j-1];av[j-1]=buf; obmen=0;}}}
while ((obmen==0) || (i==r));
break;
case 2:
do
{i=i+1;
obmen=1;
for (j=r;j>=i;j--)
{if (strcmp(av[j].rejisser,av[j-1].rejisser)<0) {buf=av[j];av[j]=av[j-1];av[j-1]=buf; obmen=0;}}}
while ((obmen==0) || (i==r));
break;
case 3:
do
{i=i+1;
obmen=1;
for (j=r;j>=i;j--)
{if (strcmp(av[j].strana,av[j-1].strana)<0) {buf=av[j];av[j]=av[j-1];av[j-1]=buf; obmen=0;}}}
while ((obmen==0) || (i==r));
break;
case 4:
do
{i=i+1;
obmen=1;
for (j=r;j>=i;j--)
{if (strcmp(av[j].god_vipuska,av[j-1].god_vipuska)<0) {buf=av[j];av[j]=av[j-1];av[j-1]=buf; obmen=0;}}}
while ((obmen==0) || (i==r));
break;
case 5:
do
{i=i+1;
obmen=1;
for (j=r;j>=i;j--)
{if (strcmp(av[j].stoimost,av[j-1].stoimost)<0) {buf=av[j];av[j]=av[j-1];av[j-1]=buf; obmen=0;}}}
while ((obmen==0) || (i==r));
break;
case 6:
do
{i=i+1;
obmen= 1;
for (j=r;j>=i;j--)
{if (strcmp(av[j].dohod,av[j-1].dohod)<0) {buf=av[j];av[j]=av[j-1];av[j-1]=buf; obmen=0;}}}
while ((obmen==0) || (i==r));
break;
default: printf("Massiv ne otsortirovan\n");}}

void print(int k)
{ int i,l;
while( 1){
printf("esli vi xotite otsortirovat po:\n");
printf("nazvaniy filma nazmite 1\n");
printf("familii rejissera filma nazmite 2\n");
printf("strane proizvoditelya filma nazmite 3\n");
printf("godu vipuska filma nazmite 4\n");
printf("stoimosti filma nazmite 5\n");
printf("dohodu filma nazmite 6\n");
printf("esli vi ne xotite sortirovat nazmite 8:\n");
scanf("%i",&l);
if (l==8){break;};
sortirovka(k,l);
getch();
for(i=0;i<=k;i++)
{printf("\nFilm nomer %i\n",i+1) ;
printf("\n nazvanie_filma  \n%s",av[i].nazvanie);
printf("\n rejisser_filma\n %s",av[i].rejisser);
printf("\n strana_proizvoditel' filma \n %s",av[i].strana);
printf("\n god_vipuska_filma\n %s",av[i].god_vipuska);
printf("\n stoimost_filma\n %s",av[i].stoimost);
printf("\n dohod_filma\n %s",av[i].dohod);
 }
  }
}

void main()
{clrscr();
int i,j;
printf("Inicializacia bazi\n");
i=init();
printf("Kolichestvo filmov v baze =%i\n",i+1)  ;
printf("\nIznacalni spisok\n");
for(j=0;j<=i;j++)
{printf("\n Film nomer %i\n",j+1) ;
printf("\n nazvanie_filma \n%s",av[j].nazvanie);
printf("\n rejisser_filma %s",av[j].rejisser);
printf("\n strana_proizvoditel' filma\n %s",av[j].strana);
printf("\n god_vipuska_filma\n %s",av[j].god_vipuska);
printf("\n stoimost'_filma\n %s",av[j].stoimost);
printf("\n dohod filma\n %s",av[j].dohod);
getch();  }

printf("\nVivod s sortirovkoi\n");
print(i);
getch();}


Добавлено @ 09:08
мне очень нужна ваша помощь, все что я могла, я сделала) если кому не очень сложно, потратьте пожалуйста немного времени...

Это сообщение отредактировал(а) MAKCim - 13.4.2008, 09:10
PM MAIL   Вверх
jonie
Дата 13.4.2008, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



Код

FILE * myDataBase = fopen("C:\\mydb.dat", "wb");
struct film myFilmItem;
..// заполняем тута структуру//...
fwrite((char*)&myFilmItem, sizeof(myFilmItem), 1, myDataBase);

//а тут читаем//
FILE * myDataBase2 = fopen("C:\\mydb.dat", "rb");
struct film myFilmItemOther;
fread((char*)&myFilmItemOther, sizeof(myFilmItemOther), 1, myDataBase2);
//тут работаем со считанной структурой


только про проверки на ошибки забывать не стоит

Это сообщение отредактировал(а) jonie - 13.4.2008, 14:30


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
МальвинаC
Дата 13.4.2008, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



jonie, спасибо тебе за внимание) я уже перепробавала множество функций, но видимо что-то не понимаю в их применении, можно попросить тебя применить эти функции к своей программе, если тебе конечно несложно smile  пожалуйста, очень прошу
PM MAIL   Вверх
МальвинаC
Дата 13.4.2008, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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




файл структур уже изначально задан...
PM MAIL   Вверх
МальвинаC
Дата 14.4.2008, 03:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



неужели так сложно....
PM MAIL   Вверх
serega00
Дата 14.4.2008, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



н-да что то вообще не понятно...
PM MAIL WWW   Вверх
Rififi
Дата 14.4.2008, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Хы. такаое впечатление, что функцию sortirovka ты нашла на какой-то помойке, впечатление оно конечно жуткое производит, был бы я менее закалённым в боях, мне бы по ночам кошмары снились :gigi:
я бы исправил её на такой вариант, или хотя бы отформатировал код.

// Сортировка по полю nazvanie
int __cdecl NazvanieComparer(const void* p1, const void* p2)
{
    const struct film* f1 = (const struct film*) p1;
    const struct film* f2 = (const struct film*) p2;
    return strcmp(f1->nazvanie, f2->nazvanie);
}

struct film* db; // массив структур film
size_t N = ...  // количество элементов в массиве

qsort(db, N, sizeof(struct film), NazvanieComparer);
PM MAIL   Вверх
МальвинаC
Дата 14.4.2008, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

Это сообщение отредактировал(а) МальвинаC - 14.4.2008, 17:09
PM MAIL   Вверх
bsa
Дата 14.4.2008, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



МальвинаC, привязка к файлам осуществляется с помощью функций fopen, fclose, fseek, fprintf и fscanf. Тебе лишь надо заменить все scanf и printf отвечающие за ввод и вывод массива, на fscanf и fprintf, а так же добавить открытие и закрытие файла.
PM   Вверх
МальвинаC
Дата 15.4.2008, 03:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



структуру не так просто считать из файла, в этом вся загвостка, записать в файл несложно, вот: 
Код

if((f=fopen("source.txt","wt"))==NULL)
{
printf("\n Error::Open File");
getch();
}
else
{
for (j=0;j<=CHET;j++)
{
fputs(av[j].nazvanie,f);
fputs(" ",f);
fputs(av[j].rejisser,f);
fputs(" ",f);
fputs(av[j].strana,f);
fputs(" ",f);
fputs(av[j].god_vipuska,f);
fputs(" ",f);
fputs(av[j].stoimost,f);
fputs(" ",f);
fputs(av[j].dohod,f);
fputs("\n",f);
fclose(f);
}
}

а вот как считать я не знаю, напишите если кто знает
PM MAIL   Вверх
МальвинаC
Дата 15.4.2008, 03:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



здесь одна структура записывается в одну строку, поля через пробелы
PM MAIL   Вверх
МальвинаC
Дата 15.4.2008, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



если кто знает, напишите пожалуйста как...потому что я не понимаю...

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


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



МальвинаC, проще всего это делать так:
Код
struct film
{
   char nazvanie[21]; //не стоит забывать про символ '\0', который означает конец строки, поэтому массив увеличен на 1 символ
   char rejisser[21];
   char strana[11];
   unsigned god_vipuska;
   double stoimost;
   double dohod;
};

...

FILE *file;
struct film film;
....
//чтение структуры из файла
fscanf(file, "%20s %20s %10s %u %f %f", film.nazvanie, film.rejisser, film.strana, &film.god_vipuska, &film.stoimost, &film.dohod);
...
fseek(file, 0, SEEK_SET); //перемещение в начало файла
...
//запись структуры в файл
fprintf(file, "%s %s %s %u %g %g", film.nazvanie, film.rejisser, film.strana, film.god_vipuska, film.stoimost, film.dohod);
...
В данном коде под числовые поля структуры отводятся специально подходящих числовых типов.
PM   Вверх
МальвинаC
Дата 15.4.2008, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



спасибо, более мненее ясно, сейчас попробую применить у себя, просто уверена, что сейчас начнут возникать проблемы smile 
PM MAIL   Вверх
bsa
Дата 15.4.2008, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Цитата(МальвинаC @ 15.4.2008,  16:03)
спасибо, более мненее ясно, сейчас попробую применить у себя, просто уверена, что сейчас начнут возникать проблемы smile

Если тупо взять и засунуть, то да - будут проблемы. Надо подойти творчески.  smile 
PM   Вверх
МальвинаC
Дата 15.4.2008, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



спасибо за внимание, вставила новые строки, компилятор как будто бы не понимает что такое i, что он зацикливает и не считывает в массив структур
вот мой исходник

Код

#include <stdio.h>
#include <conio.h>
#include <string.h>
struct film
{
char nazvanie[20];
char rejisser[20];
char strana[10];
char god_vipuska[4];
char stoimost[10];
char dohod[10];

}
 av[100];
const int M=100;


void sortirovka(int r, int w)
{int  i,j,obmen;i=0;
struct film buf;
switch (w)
{ case 1:
do
{i=i+1;
obmen=1;
for (j=r;j>=i;j--)
{if (strcmp(av[j].nazvanie,av[j-1].nazvanie)<0) {buf=av[j];av[j]=av[j-1];av[j-1]=buf; obmen=0;}}}
while ((obmen==0) || (i==r));
break;
case 2:
do
{i=i+1;
obmen=1;
for (j=r;j>=i;j--)
{if (strcmp(av[j].rejisser,av[j-1].rejisser)<0) {buf=av[j];av[j]=av[j-1];av[j-1]=buf; obmen=0;}}}
while ((obmen==0) || (i==r));
break;
case 3:
do
{i=i+1;
obmen=1;
for (j=r;j>=i;j--)
{if (strcmp(av[j].strana,av[j-1].strana)<0) {buf=av[j];av[j]=av[j-1];av[j-1]=buf; obmen=0;}}}
while ((obmen==0) || (i==r));
break;
case 4:
do
{i=i+1;
obmen=1;
for (j=r;j>=i;j--)
{if (strcmp(av[j].god_vipuska,av[j-1].god_vipuska)<0) {buf=av[j];av[j]=av[j-1];av[j-1]=buf; obmen=0;}}}
while ((obmen==0) || (i==r));
break;
case 5:
do
{i=i+1;
obmen=1;
for (j=r;j>=i;j--)
{if (strcmp(av[j].stoimost,av[j-1].stoimost)<0) {buf=av[j];av[j]=av[j-1];av[j-1]=buf; obmen=0;}}}
while ((obmen==0) || (i==r));
break;
case 6:
do
{i=i+1;
obmen= 1;
for (j=r;j>=i;j--)
{if (strcmp(av[j].dohod,av[j-1].dohod)<0) {buf=av[j];av[j]=av[j-1];av[j-1]=buf; obmen=0;}}}
while ((obmen==0) || (i==r));
break;
default: printf("Massiv ne otsortirovan\n");}}

void print(int k)
{ int i,l;
while( 1){
printf("esli vi xotite otsortirovat po:\n");
printf("nazvaniy filma nazmite 1\n");
printf("familii rejissera filma nazmite 2\n");
printf("strane proizvoditelya filma nazmite 3\n");
printf("godu vipuska filma nazmite 4\n");
printf("stoimosti filma nazmite 5\n");
printf("dohodu filma nazmite 6\n");
printf("esli vi ne xotite sortirovat nazmite 8:\n");
scanf("%i",&l);
if (l==8){break;};
sortirovka(k,l);
getch();
for(i=0;i<=k;i++)
{printf("\nFilm nomer %i\n",i+1) ;
printf("\n nazvanie_filma  \n%s",av[i].nazvanie);
printf("\n rejisser_filma\n %s",av[i].rejisser);
printf("\n strana_proizvoditel' filma \n %s",av[i].strana);
printf("\n god_vipuska_filma\n %s",av[i].god_vipuska);
printf("\n stoimost_filma\n %s",av[i].stoimost);
printf("\n dohod_filma\n %s",av[i].dohod);
 }
  }
}

void main()
{clrscr();
int i,j;
FILE *f=fopen("source.txt","r");
while feof(f)
{
fscanf(f,"%20s  %20s %10s %4s %10s %10s",av[i].nazvanie,av[i].rejisser,av[i].strana,av[i].god_vipuska,av[i].stoimost,av[i].dohod);
i=i+1;
}
fseek(f,0,SEEK_SET);
fclose(f);
printf("Inicializacia bazi\n");
printf("Kolichestvo filmov v baze =%i\n",i+1)  ;
printf("\nIznacalni spisok\n");
for(j=0;j<=i;j++)
{printf("\n Film nomer %i\n",j+1) ;
printf("\n nazvanie_filma \n%s",av[j].nazvanie);
printf("\n rejisser_filma %s",av[j].rejisser);
printf("\n strana_proizvoditel' filma\n %s",av[j].strana);
printf("\n god_vipuska_filma\n %s",av[j].god_vipuska);
printf("\n stoimost'_filma\n %s",av[j].stoimost);
printf("\n dohod filma\n %s",av[j].dohod);
getch();
}
printf("\nVivod s sortirovkoi\n");
print(i);
fopen("source.txt","r");
for(j=0;j<=i;j++)
{
fprintf(f,"%20s  %20s %10s %4s %10s %10s",av[j].nazvanie,av[j].rejisser,av[j].strana,av[j].god_vipuska,av[j].stoimost,av[j].dohod);
fputs("\n",f);
j=j+1;
}
fclose(f);
getch();}





Это сообщение отредактировал(а) МальвинаC - 15.4.2008, 16:44
PM MAIL   Вверх
bsa
Дата 15.4.2008, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



МальвинаC, ну отформатируй код наконец - самой же искать ошибки будет проще. Например, так:
Код
void main()
{
   int i; //i содержит мусор
   int j;
   clrscr();
   FILE *f=fopen("source.txt","r");
   while feof(f)
   {
      fscanf(f,"%20s  %20s %10s %4s %10s %10s",av[i].nazvanie,av[i].rejisser,av[i].strana,av[i].god_vipuska,av[i].stoimost,av[i].dohod);
      i=i+1;
   }
   fseek(f,0,SEEK_SET);
   fclose(f);
   printf("Inicializacia bazi\n");
   printf("Kolichestvo filmov v baze =%i\n",i+1)  ;
   printf("\nIznacalni spisok\n");
   for(j=0;j<=i;j++)
   {
      printf("\n Film nomer %i\n",j+1) ;
      printf("\n nazvanie_filma \n%s",av[j].nazvanie);
      printf("\n rejisser_filma %s",av[j].rejisser);
      printf("\n strana_proizvoditel' filma\n %s",av[j].strana);
      printf("\n god_vipuska_filma\n %s",av[j].god_vipuska);
      printf("\n stoimost'_filma\n %s",av[j].stoimost);
      printf("\n dohod filma\n %s",av[j].dohod);
      getch();
   }
   printf("\nVivod s sortirovkoi\n");
   print(i);
   fopen("source.txt","r");
   for(j=0;j<=i;j++)
   {
      fprintf(f,"%20s  %20s %10s %4s %10s %10s",av[j].nazvanie,av[j].rejisser,av[j].strana,av[j].god_vipuska,av[j].stoimost,av[j].dohod);
      fputs("\n",f);
      j=j+1;
   }
   fclose(f);
   getch();
}

В частности, где у тебя i инициализируется перед использованием в 106-й строке?

Кстати, что такое "компилятор не понимает" по твоему? Когда компилятор не понимает, он выдает ошибку.
PM   Вверх
МальвинаC
Дата 15.4.2008, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



он сейчас выдает фильм номер 1.... 
                              название...
                                 .....
                              фильм номер номер 2....
                              название
                                   .....
                                   ....
                                    ....
                             фильм номер 2013
тоесть i=2013?
да, я так понимаю, именно в 106 строчке
PM MAIL   Вверх
МальвинаC
Дата 15.4.2008, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



 ужасное, что я не вижу ошибку, а сдавать завтра
PM MAIL   Вверх
bsa
Дата 15.4.2008, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Код
int i; //после этой операции i содержит мусор
...
i = i + 1; //а в этой строке к "мусору" прибавляется 1
Что будет, если к мусору прибавить 1?  smile 
PM   Вверх
МальвинаC
Дата 15.4.2008, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



ну я прописала i=0; он все равно не считывает, помоги пожалуйста исправить код.... я уже в панике....

Добавлено через 7 минут и 44 секунды
кстати j=j+1? в цикле for нужно убрать, но он все равно не считывает
PM MAIL   Вверх
bsa
Дата 15.4.2008, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



feof() выдает 0, когда файл не достиг конца. while выполняется пока условие не равно нулю. Таким образом, цикл не выполняется никогда. Чтобы он выполнялся, нужно инвертировать условие:
Код
while( !feof(f) )...

Далее, когда ты пишешь цикл 
Код
for(i=0; i < 10; ++i)
то его компилятор преобразует в следующий код:
Код
i = 0;
while(i < 10) {
    ...
    ++i;
}
Поэтому инкрементировать j (j = j +1 или что тоже самое ++j) не надо внутри тела цикла.
PM   Вверх
МальвинаC
Дата 15.4.2008, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



ну да, логично с файлами, и почему же он не считывает
PM MAIL   Вверх
bsa
Дата 15.4.2008, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



МальвинаC, отформатируй весь свой код так, как я показал. Тогда и будем ошибки искать.
Кстати, ты !feof(f) сделала?
PM   Вверх
МальвинаC
Дата 15.4.2008, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



да, сделала) сейчас выложу код

Добавлено через 54 секунды
Код

void main()
{
   int i; //i содержит мусор
   int j;
   clrscr();
   FILE *f=fopen("source.txt","r");
   while (!feof(f))
   {
      fscanf(f,"%20s  %20s %10s %4s %10s %10s",av[i].nazvanie,av[i].rejisser,av[i].strana,av[i].god_vipuska,av[i].stoimost,av[i].dohod);
      i=i+1;
   }
   fseek(f,0,SEEK_SET);
   fclose(f);
   printf("Inicializacia bazi\n");
   printf("Kolichestvo filmov v baze =%i\n",i+1)  ;
   printf("\nIznacalni spisok\n");
   for(j=0;j<=i;j++)
   {
      printf("\n Film nomer %i\n",j+1) ;
      printf("\n nazvanie_filma \n%s",av[j].nazvanie);
      printf("\n rejisser_filma %s",av[j].rejisser);
      printf("\n strana_proizvoditel' filma\n %s",av[j].strana);
      printf("\n god_vipuska_filma\n %s",av[j].god_vipuska);
      printf("\n stoimost'_filma\n %s",av[j].stoimost);
      printf("\n dohod filma\n %s",av[j].dohod);
      getch();
   }
   printf("\nVivod s sortirovkoi\n");
   print(i);
   fopen("source.txt","r");
   for(j=0;j<=i;j++)
   {
      fprintf(f,"%20s  %20s %10s %4s %10s %10s",av[j].nazvanie,av[j].rejisser,av[j].strana,av[j].god_vipuska,av[j].stoimost,av[j].dohod);
      fputs("\n",f);
   }
   fclose(f);
   getch();
}


Добавлено через 2 минуты и 5 секунд
ой, сейчас весь выложу

Добавлено через 10 минут и 54 секунды
сортировка проходит верно, ошибка где-то с файлами
Код

#include <stdio.h>
#include <conio.h>
#include <string.h>
 struct film
{
     char nazvanie[20];
     char rejisser[20];
     char strana[10];
     char god_vipuska[4];
     char stoimost[10];
     char dohod[10];

}
    av[100];
    const int M=100;


     void sortirovka(int r, int w)
 {
    int  i,j,obmen;i=0;
    struct film buf;
    switch (w)
    { case 1:
      do
     {i=i+1;
      obmen=1;
        for (j=r;j>=i;j--)
      {if (strcmp(av[j].nazvanie,av[j-1].nazvanie)<0) {buf=av[j];av[j]=av[j-1];av[j-1]=buf; obmen=0;}}}
          while ((obmen==0) || (i==r));
       break;
      case 2:
       do
      {i=i+1;
      obmen=1;
        for (j=r;j>=i;j--)
      {if (strcmp(av[j].rejisser,av[j-1].rejisser)<0) {buf=av[j];av[j]=av[j-1];av[j-1]=buf; obmen=0;}}}
           while ((obmen==0) || (i==r));
       break;
       case 3:
        do
        {i=i+1;
      obmen=1;
         for (j=r;j>=i;j--)
       {if (strcmp(av[j].strana,av[j-1].strana)<0) {buf=av[j];av[j]=av[j-1];av[j-1]=buf; obmen=0;}}}
            while ((obmen==0) || (i==r));
        break;
        case 4:
        do
        {i=i+1;
        obmen=1;
          for (j=r;j>=i;j--)
       {if (strcmp(av[j].god_vipuska,av[j-1].god_vipuska)<0) {buf=av[j];av[j]=av[j-1];av[j-1]=buf; obmen=0;}}}
             while ((obmen==0) || (i==r));
        break;
        case 5:
        do
        {i=i+1;
        obmen=1;
        for (j=r;j>=i;j--)
            {if (strcmp(av[j].stoimost,av[j-1].stoimost)<0) {buf=av[j];av[j]=av[j-1];av[j-1]=buf; obmen=0;}}}
             while ((obmen==0) || (i==r));
          break;
         case 6:
         do
         {i=i+1;
         obmen= 1;
         for (j=r;j>=i;j--)
             {if (strcmp(av[j].dohod,av[j-1].dohod)<0) {buf=av[j];av[j]=av[j-1];av[j-1]=buf; obmen=0;}}}
              while ((obmen==0) || (i==r));
            break;
        default: printf("Massiv ne otsortirovan\n");}}
void print(int k)
{ int i,l;
while( 1){
         printf("esli vi xotite otsortirovat po:\n");
         printf("nazvaniy filma nazmite 1\n");
         printf("familii rejissera filma nazmite 2\n");
         printf("strane proizvoditelya filma nazmite 3\n");
         printf("godu vipuska filma nazmite 4\n");
         printf("stoimosti filma nazmite 5\n");
         printf("dohodu filma nazmite 6\n");
         printf("esli vi ne xotite sortirovat nazmite 8:\n");
           scanf("%i",&l);
            if (l==8){break;};
    sortirovka(k,l);
    getch();
   for(i=0;i<=k;i++)
    {printf("\nFilm nomer %i\n",i+1) ;
      printf("\n nazvanie_filma  \n%s",av[i].nazvanie);
      printf("\n rejisser_filma\n %s",av[i].rejisser);
      printf("\n strana_proizvoditel' filma \n %s",av[i].strana);
      printf("\n god_vipuska_filma\n %s",av[i].god_vipuska);
      printf("\n stoimost_filma\n %s",av[i].stoimost);
      printf("\n dohod_filma\n %s",av[i].dohod);
    }
  }
}
void main()
{
   int i; 
   int j;
   clrscr();
   FILE *f=fopen("source.txt","r");
   while (!feof(f))
   {
      fscanf(f,"%20s  %20s %10s %4s %10s %10s",av[i].nazvanie,av[i].rejisser,av[i].strana,av[i].god_vipuska,av[i].stoimost,av[i].dohod);
      i=i+1;
   }
   fseek(f,0,SEEK_SET);
   fclose(f);
   printf("Inicializacia bazi\n");
   printf("Kolichestvo filmov v baze =%i\n",i+1)  ;
   printf("\nIznacalni spisok\n");
   for(j=0;j<=i;j++)
   {
      printf("\n Film nomer %i\n",j+1) ;
      printf("\n nazvanie_filma \n%s",av[j].nazvanie);
      printf("\n rejisser_filma %s",av[j].rejisser);
      printf("\n strana_proizvoditel' filma\n %s",av[j].strana);
      printf("\n god_vipuska_filma\n %s",av[j].god_vipuska);
      printf("\n stoimost'_filma\n %s",av[j].stoimost);
      printf("\n dohod filma\n %s",av[j].dohod);
      getch();
   }
   printf("\nVivod s sortirovkoi\n");
   print(i);
   fopen("source.txt","r");
   for(j=0;j<=i;j++)
   {
      fprintf(f,"%20s  %20s %10s %4s %10s %10s",av[j].nazvanie,av[j].rejisser,av[j].strana,av[j].god_vipuska,av[j].stoimost,av[j].dohod);
      fputs("\n",f);
   }
   fclose(f);
   getch();
}




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


Бывалый
*


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

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



Цитата(МальвинаC @  15.4.2008,  19:30 Найти цитируемый пост)

Код

fclose(f);
// ...
fopen("source.txt","r");

for(j=0;j<=i;j++)
{
  fprintf(f,"%20s  %20s %10s %4s %10s %10s",av[j].nazvanie,av[j].rejisser,av[j].strana,av[j].god_vipuska,av[j].stoimost,av[j].dohod);
  fputs("\n",f);
}
fclose(f);


а куда всё это записывается, ведь f закрыта.
проверьте ещё раз содержимое файла.
--------------------
"постановка задачи наполовину решает саму задачу"
PM MAIL   Вверх
МальвинаC
Дата 15.4.2008, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



файл открыт для чтения когда мы записываем в массив структур, а для записи, когда записываем в файл

Добавлено через 2 минуты и 1 секунду
когда он заккрыт, мы просто выводим массив структур на экран
PM MAIL   Вверх
Optimus
Дата 15.4.2008, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(МальвинаC @  15.4.2008,  19:30 Найти цитируемый пост)
 
Код

while (!feof(f))
{
  fscanf(f,"%20s  %20s %10s %4s %10s %10s",av[i].nazvanie,av[i].rejisser,av[i].strana,av[i].god_vipuska,av[i].stoimost,av[i].dohod);
   i=i+1;
}

// ...

for(j=0;j<=i;j++)
{
  fprintf(f,"%20s  %20s %10s %4s %10s %10s",av[j].nazvanie,av[j].rejisser,av[j].strana,av[j].god_vipuska,av[j].stoimost,av[j].dohod);
  fputs("\n",f);
}


а ничего что в файл записывается "\n", но не считывается.
Извиняюсь если где-то не прав, мало на С программировал.
--------------------
"постановка задачи наполовину решает саму задачу"
PM MAIL   Вверх
МальвинаC
Дата 15.4.2008, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



я тоже мало) думаю ничего страшного, /n-переход на новую строку, а считывает он построчно.... хотя не знаю, я надеюсь на bsa smile 
PM MAIL   Вверх
Optimus
Дата 15.4.2008, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(МальвинаC @  15.4.2008,  19:49 Найти цитируемый пост)
когда он заккрыт, мы просто выводим массив структур на экран 

файл открывается, но переменной f не присваивается

проверьте ещё раз содержимое файла. 

Это сообщение отредактировал(а) Optimus - 15.4.2008, 20:01
--------------------
"постановка задачи наполовину решает саму задачу"
PM MAIL   Вверх
bsa
Дата 15.4.2008, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



МальвинаC
Во-первых, когда ты открываешь файл, то ты должна сохранить его дескриптор, в строке 103 ты его сохраняешь в переменную f, а в строке 127 нет, поэтому дальнейшая операция fprintf пытается вывести данные непонятно куда (в закрытый файл).
Во-вторых, файл может не открыться, поэтому ты должна проверить его дескриптор на NULL и вывести сообщение об ошибке.
В-третьих, в строке 127 операция fopen("file.txt", "r") открывает файл только для чтения. А тебе нужно в него писать. Поэтому замени "r" на "w"
В-четвертых, перед закрытием файла делать fseek смысла нет никакого - позиция после открытия не зависит от той, что была перед закрытием.
В-пятых, ты так и не исправила работу с неинициализированной переменной i (строка 100).
В-шестых, при форматировании кода после фигурной скобки может идти только комментарий.
PM   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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