Перейти к содержанию

Помогите найти ошибку в программе.


Рекомендуемые сообщения

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

#include

#include

#include "iostream"

struct DETAL{

int number;

float wes;

float cost;

int data[3];

int status;

int volume;

};

void add(FILE *a);

void last(FILE *f);

void vivlast(void);

void good(FILE *f);

void disp(FILE *e);

void main (){

setlocale (0, "");

int i,j;

struct DETAL detal;

FILE *f,*g,*h;

printf("для создания нового файла нажмите 1, для использования готового 2\n");

scanf("%i",&j);

switch(j){

case 1: f=fopen("info.txt","w+");break;

case 2: f=fopen("info.txt","a+");break;

default: printf("!Ошибка!");

};

for(;;){

printf("для добавления записи нижмите 1\n для поска и вывода последней детали 2\n для поиска и вывода деталей со знаком качества 3\n для вывода всех деталей 4\n для выхода 0\n");

scanf("%i",&i);

switch (i)

{

case 1: add(f);break;

case 2: last(f);break;

case 3: good(f);break;

case 4: disp(f);break;

case 0: exit(0);break;

default: printf("!!Ошибка!!");

};

}

getch();}

void add(FILE *a){

struct DETAL op;

printf ("\nВведите номер\n");

scanf ("%i", &op.number);

printf ("Введите вес\n");

scanf ("%f", &op.wes);

printf ("Введите цену\n");

scanf ("%f", &op.cost);

printf ("Введите дату производства\n");

scanf ("%i %i %i", &op.data[0], &op.data[1], &op.data[2]);

printf ("Введите статус\n");

scanf ("%i", &op.status);

printf ("Введите объем\n");

scanf ("%i", &op.volume);

fwrite(&op, sizeof(struct DETAL), 1, a);

}

void last(FILE *f){

struct DETAL s,detal;

int max0=0,max1=0,max2=0;

FILE *o;

o=fopen("Last.txt","w+");

rewind(f);

while(!feof(f)){

fread(&detal, sizeof(struct DETAL), 1, f);

if (detal.data[2]>max2)

{

max2=detal.data[2];

max1=detal.data[1];

max0=detal.data[0];

s=detal;

}

else

if (detal.data[2]==max2)

if (detal.data[1]>max1)

{

max1=detal.data[1];

max0=detal.data[0];

s=detal;

}

else if (detal.data[1]==max1)

if(detal.data[0]>max0)

{

max0=detal.data[0];

s=detal;

}

}

printf(" \n \n");

printf ("Номер: %i\n", s.number);

printf ("Обьем: %i\n", s.volume);

printf ("Цена: %f\n", s.cost);

fwrite(&s, sizeof(struct DETAL), 1, o);

fclose(o);

}

/*void vivlast(void){

struct DETAL op;

FILE *d=fopen("Last.txt","r");

fread(&op,sizeof(struct DETAL), 1, d);

printf("Постедняя по дате деталь: \n");

printf ("%i ", op.number);

printf ("%f ", op.wes);

printf ("%f ", op.cost);

printf ("%i %i %i ", op.data[0], op.data[1], op.data[2]);

printf("%i ", op.status);

printf ("%i ", op.volume);

fclose(d);

}*/

void good(FILE *f)

{

struct DETAL detal;

FILE *u=fopen("Good.txt","w+");

rewind(f);

while(!feof(f))

{

fread(&detal, sizeof(struct DETAL), 1, f);

if(detal.status==1)

{

fwrite(&detal, sizeof(struct DETAL), 1, u);

}}

rewind(u);

while(!feof(u)){

fread(&detal, sizeof(struct DETAL), 1, u);

printf("Детали имеющие знак качества: \n");

printf ("%i ", detal.number);

printf("%f ",detal.wes);

printf("%f ", detal.cost);

printf("%i %i %i ", detal.data[0], detal.data[1], detal.data[2]);

printf("%i ", detal.status);

printf("%i ", detal.volume);

printf("\n\n");

}}

void disp(FILE *e){

struct DETAL detal;

rewind(e);

printf("\n");

while(!feof(e)){

fread(&detal, sizeof(struct DETAL), 1, e);

printf("Все имеющиеся детали: \n");

printf ("%i ", detal.number);

printf("%f ",detal.wes);

printf("%f ", detal.cost);

printf("%i %i %i ", detal.data[0], detal.data[1], detal.data[2]);

printf("%i ", detal.status);

printf("%i ", detal.volume);

printf("\n");

}}

Ссылка на комментарий

ну есть основной цикл, в котором предоставляется выбор действий:

for(;

;){

printf("для добавления записи нижмите 1\n для поска и вывода последней детали 2\n для поиска и вывода деталей со знаком качества 3\n для вывода всех деталей 4\n для выхода 0\n");

scanf("%i",&i);

switch (i)

{

case 1: add(f);break;

case 2: last(f);break;

case 3: good(f);break;

case 4: disp(f);break;

case 0: exit(0);break;

default: printf("!!Ошибка!!");

};

}

функция записи структуры в файл:

void add(FILE *a){

struct DETAL op;

printf ("\nВведите номер\n");

scanf ("%i", &op.number);

printf ("Введите вес\n");

scanf ("%f", &op.wes);

printf ("Введите цену\n");

scanf ("%f", &op.cost);

printf ("Введите дату производства\n");

scanf ("%i %i %i", &op.data[0], &op.data[1], &op.data[2]);

printf ("Введите статус\n");

scanf ("%i", &op.status);

printf ("Введите объем\n");

scanf ("%i", &op.volume);

fwrite(&op, sizeof(struct DETAL), 1, a);

}

лично моё мнение, что вся проблема со чтением из файла..

Ссылка на комментарий

   Тьфу, совсем код не смотрел, когда вопрос задал. Насколько помню не совсем верно использовать цикл по while(!feof(e)), юзай сразу while(fread(&detal, sizeof(struct DETAL), 1, e))

Ссылка на комментарий

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

Вы сможете оставить комментарий после входа в



Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...