Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C++] Работа с файлами


Автор: asustek 7.12.2007, 19:01
Программа предстовляет собой вндомость студентов.
Дан текстовый файл следующего вида:
Код

max el 3 4 5
ket el 2 3 3
fed pr 2 4 5
jon el 6 7 4
lon pk 4 2 4

Первый столбец -  Имя
Второй столбец - Специальность
Третий столбец - Оценка физике
Четвертый столбец -  Оценка математике
Пятый столбец - Оценка по литературе

С клавиатуры вводится специальность. Записать в новый файл имена студентов обючающихся на специальности которая была введена с клавиатуры и сумарный балл для каждого студента.(Сумарный балл вычисляется следующим образом: Оценка по физике+оценка мо математике+оценка по литературе. Записи в новом файле должны быть упорядоченны по первой букве имени в алфавитном порядке.
Вот что у меня получилось:

Код

#include "stdio.h"
#include "conio.h"
#include "string.h"
#include "stdlib.h"


#define FNAME "c:\\bd_2.txt\0"//Файл источник
#define RESULT "c:\\result.txt\0"//Файл в который сохраняется результат
main()
{
      char fname[90]=FNAME;
      char result[90]=RESULT;
      FILE *out;
      FILE *in;
      char surname[10];//Имя
      char spec[10];//Специальность
      char fiz[10];//Оценка по физике
      char mat[10];//Оценка по математике
      char lit[10];//Оценка по физике
      char spec_obr[10];//Образец для поиска в базе данных
      int f, m, l, sum, k;
      f=0;
      m=0;
      l=0;
      sum=0;
      k=0;
if (((out=fopen(fname, "r"))==NULL)&&((in=fopen(result, "a"))==NULL))
{
  printf("error read file");
 getch();
 return 0;
}
printf ("specialnost\n ->");
      scanf("%s",&spec_obr);
   while (!feof(out))
 {
       
         fscanf (out,"%s %s %s %s %s",surname, spec, fiz, mat, lit);
          if (feof(out))  break;
           if(!strcmp(spec_obr, spec))
           { 
             f=atoi(fiz);
               m=atoi(mat);
                 l=atoi(lit);
                   sum=f+m+l;
                  fprintf(in,"%s, %i\n",surname, sum);
                  k++;
                  }
            
 }
if (k=0) 
printf ("Specialnosti %s v BD ne naydenno\n",spec_obr);
else
printf("Gotovo\n");
getch();
}




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


             

 

Автор: likehood 7.12.2007, 20:43
Цитата(asustek @  7.12.2007,  19:01 Найти цитируемый пост)
Проблема в том что результат не сохраняется в файл.

А если результат выводить на консоль, то работает?

Автор: asustek 7.12.2007, 20:53
Цитата(likehood @ 7.12.2007,  20:43)
Цитата(asustek @  7.12.2007,  19:01 Найти цитируемый пост)
Проблема в том что результат не сохраняется в файл.

А если результат выводить на консоль, то работает?

Результат на консоль выводится, но неправильный.

Автор: likehood 7.12.2007, 21:19
Цитата(asustek @  7.12.2007,  20:53 Найти цитируемый пост)
Результат на консоль выводится, но неправильный.

да вроде правильный. например, для специальности == el выводится:
max, 12
ket, 8
jon, 17

А ошибка в твоей программе в строке 27: нужно вместо && написать ||. В твоей программе, если первое условие не выполнено (то есть, первый файл успешно открылся), второе условие не проверятеся, а значит второй файл не будет открыт. Да и по логике нужна проверка ||.

Автор: likehood 7.12.2007, 21:44
вот окончательный вариант с сортировкой:
Код

#include "stdio.h"
#include "conio.h"
#include "string.h"
#include "stdlib.h"

#define FNAME "c:\\bd_2.txt\0"//Файл источник
#define RESULT "c:\\result.txt\0"//Файл в который сохраняется результат

struct NameS {
    char name[10];
    int sum;
};

int comp(const void *s1, const void *s2)
{
    return strcmp( ((const NameS*)s1)->name, ((const NameS*)s2)->name );
}

int main()
{
      char fname[90]=FNAME;
      char result[90]=RESULT;
      FILE *out;
      FILE *in;
      char surname[10];//Имя
      char spec[10];//Специальность
      char fiz[10];//Оценка по физике
      char mat[10];//Оценка по математике
      char lit[10];//Оценка по физике
      char spec_obr[10];//Образец для поиска в базе данных
      NameS properNames[10];
      int f, m, l, sum, k;
      f=0;
      m=0;
      l=0;
      sum=0;
      k=0;
if (((out=fopen(fname, "r"))==NULL) || ((in=fopen(result, "w"))==NULL))
{
  printf("error read file");
 getch();
 return 0;
}
printf ("specialnost\n ->");
      scanf("%s",&spec_obr);
   while (!feof(out))
 {
       
         fscanf (out,"%s %s %s %s %s",surname, spec, fiz, mat, lit);
          if (feof(out))  break;
           if(!strcmp(spec_obr, spec))
           { 
             f=atoi(fiz);
               m=atoi(mat);
                 l=atoi(lit);
                   sum=f+m+l;
                   strcpy(properNames[k].name, surname);
                   properNames[k].sum = sum;
                  k++;
                  }
            
 }
if (k==0) 
printf ("Specialnosti %s v BD ne naydenno\n",spec_obr);
else
printf("Gotovo\n");

qsort(properNames, k, sizeof(NameS), comp);
for (int i=0; i<k; i++)
    fprintf(in, "%s, %i\n", properNames[i].name, properNames[i].sum);
fclose(in);
fclose(out);

getch();
}

Автор: asustek 7.12.2007, 22:28
Цитата

да вроде правильный. например, для специальности == el выводится:
max, 12
ket, 8
jon, 1

Да ты прав, результат выводится правильный, я чтото недосмотрел.
Спасибо большое за помощь!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)