Форум программистов, компьютерный форум CyberForum.ru

Файлы. Считать с файлового документа студентов с датой рождения,отсортировать по возрасту и записать... - C++

Восстановить пароль Регистрация
 
Avicii
 Аватар для Avicii
2 / 2 / 0
Регистрация: 01.12.2012
Сообщений: 123
31.03.2013, 18:00     Файлы. Считать с файлового документа студентов с датой рождения,отсортировать по возрасту и записать... #1
Здравствуйте,помогите с программой,с виду все правильно,но выдает непонятный результат. Задание : Считать с файлового документа студентов с датой рождения,отсортировать по возрасту и записать в другой текстовый документ. Возможно не правильно веду считывания с файла.
Содержимое файла:
Кликните здесь для просмотра всего текста
Sasha 14 9 1991
Pasha 3 7 1991
Andrу 6 1 1990
Kosty 8 11 1992
Polik 2 7 1991

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <iostream>
#include <stdio.h>
using namespace std;
struct student {char fio [20];
                 int den;
                 int month;
                 int god;
                };
FILE *InFile, *OutFile;
int main()
{ int n=5;
  student gr[5],s;
    InFile=fopen ("ops.txt","rt");
    OutFile=fopen ("rez.txt","wt");
 for (int i=0;i<n;i++)
    fread(&gr[i],sizeof (student),1,InFile);
 fprintf (OutFile,"Po vozrasty\n");
  for (int i=0;i<n;i++)
        for (int j=0;j<n;j++)
            if (gr[i].god>gr[j].god) //сортировка по годам
            {
                s=gr[i];
                gr[i]=gr[j];
                gr[j]=s;
            }
    for(int i=0;i<n;i++)//сортировка по месяцам
        for(int j=0;j<n;j++)
            if (gr[i].god==gr[j].god)
            {
                 if(gr[i].month>gr[j].month)
                 {
                    s=gr[i];
                    gr[i]=gr[j];
                    gr[j]=s;
                 }
            }
    for(int i=0;i<n;i++)//сортировка по дням
        for(int j=0;j<n;j++)
            if (gr[i].god==gr[j].god && gr[i].month==gr[j].month)
            {
                 if(gr[i].den>gr[j].den)
                 {
                    s=gr[i];
                    gr[i]=gr[j];
                    gr[j]=s;
                 }
            }
for (int i=0;i<n;i++)
 fprintf(OutFile,"%s\n",gr[i].fio,"%d\n",gr[i].den,gr[i].month,gr[i].god);
return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.03.2013, 18:00     Файлы. Считать с файлового документа студентов с датой рождения,отсортировать по возрасту и записать...
Посмотрите здесь:

C++ В структуре отсортировать студентов по возрасту.
C++ Записи: Вывести списки студентов, упорядоченные по возрасту
C++ Упорядочить список студентов по году рождения и распечатать его
C++ Из одного файла считать целые числа, в другие файлы записать четные и нечетные числа
Распечатать список студентов, которые получили только оценки 5 на экзаменах, в возрастающем порядке по возрасту C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Adler
 Аватар для Adler
78 / 78 / 3
Регистрация: 07.05.2009
Сообщений: 316
31.03.2013, 18:30     Файлы. Считать с файлового документа студентов с датой рождения,отсортировать по возрасту и записать... #2
ошибка тут:
C++
1
fread(&gr[i],sizeof (student),1,InFile);
используй fscanf вместо fread.
Avicii
 Аватар для Avicii
2 / 2 / 0
Регистрация: 01.12.2012
Сообщений: 123
31.03.2013, 19:40  [ТС]     Файлы. Считать с файлового документа студентов с датой рождения,отсортировать по возрасту и записать... #3
Цитата Сообщение от Adler Посмотреть сообщение
ошибка тут:
C++
1
fread(&gr[i],sizeof (student),1,InFile);
используй fscanf вместо fread.
Подскажие тогда,как отформатировать эту строку.

Добавлено через 18 минут
Не получается =(
C++
1
fscanf(InFile,"%s",gr[i].fio,"%d",gr[i].den,gr[i].month,gr[i].god);
Adler
 Аватар для Adler
78 / 78 / 3
Регистрация: 07.05.2009
Сообщений: 316
31.03.2013, 22:31     Файлы. Считать с файлового документа студентов с датой рождения,отсортировать по возрасту и записать... #4
как-то так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <stdio.h>
using namespace std;
struct student 
{
  char fio[20];
  int den;
  int month;
  int god;
};
 
int main()
{
  student gr[5];
  for(int i=0;i<5;i++){
    scanf("%s %d %d %d\n",&gr[i].fio,&gr[i].den,&gr[i].month,&gr[i].god);
    printf("%s %d %d %d\n",gr[i].fio,gr[i].den,gr[i].month,gr[i].god);
  }
  return 0;
}
http://ideone.com/GZ5TNH
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
31.03.2013, 23:04     Файлы. Считать с файлового документа студентов с датой рождения,отсортировать по возрасту и записать... #5
Цитата Сообщение от Avicii Посмотреть сообщение
Подскажие тогда,как отформатировать эту строку.
fscanf читает до пробельного символа. Значит нужно на строку в файле - четыре fscanf.
Avicii
 Аватар для Avicii
2 / 2 / 0
Регистрация: 01.12.2012
Сообщений: 123
01.04.2013, 00:24  [ТС]     Файлы. Считать с файлового документа студентов с датой рождения,отсортировать по возрасту и записать... #6
Спасибо,разобрался
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <iostream>
#include <stdio.h>
using namespace std;
struct student {char fio [20];
                 int den;
                 int month;
                 int god;
                };
FILE *InFile, *OutFile;
int main()
{ int n=5;
  student gr[5],s;
    InFile=fopen ("ops.txt","rt");
    OutFile=fopen ("rez.txt","wt");
 for (int i=0;i<n;i++)
    fscanf(InFile,"%s %d %d %d\n",&gr[i].fio,&gr[i].den,&gr[i].month,&gr[i].god);
 fprintf (OutFile,"Po vozrasty\n");
  for (int i=0;i<n;i++)
        for (int j=0;j<n;j++)
            if (gr[i].god>gr[j].god) //сортировка по годам
            {
                s=gr[i];
                gr[i]=gr[j];
                gr[j]=s;
            }
    for(int i=0;i<n;i++)//сортировка по месяцам
        for(int j=0;j<n;j++)
            if (gr[i].god==gr[j].god)
            {
                 if(gr[i].month>gr[j].month)
                 {
                    s=gr[i];
                    gr[i]=gr[j];
                    gr[j]=s;
                 }
            }
    for(int i=0;i<n;i++)//сортировка по дням
        for(int j=0;j<n;j++)
            if (gr[i].god==gr[j].god && gr[i].month==gr[j].month)
            {
                 if(gr[i].den>gr[j].den)
                 {
                    s=gr[i];
                    gr[i]=gr[j];
                    gr[j]=s;
                 }
            }
for (int i=0;i<n;i++)
 fprintf(OutFile,"%s %d %d %d\n",gr[i].fio,gr[i].den,gr[i].month,gr[i].god);
return 0;
}
Все получается.

Добавлено через 36 минут
Еще есть один вопрос =)
Задача похожая,только работа с матрицей.Проблема в том что не считывает данные с фалйа,а берет какие-то левые,не не знаю в чем причина.
Данные исходного файла:
1.1 -2 3.5 -4 5
6.5 7 8 9.3 -10
11.4 12 -13 14 15.5
16 -17 18 -19 20.5
21 22.6 23 24 -25
26 27 28 29.3 -30
31.7 32 -33 34 -35
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
#include <stdio.h>
#include <cmath>
#include <stdlib.h>
using namespace std;
 
int main()
{int i,j;
 float a[5][7];
 FILE *fp,*fp1;
 fp=fopen("dat.txt","rt");
 fp1=fopen("rez.txt","wt");
 for (i=0;i<5;i++)
 {for (j=0;j<7;j++)
  {fscanf (fp,"%d ",&a[i][j]);
   if (a[i][j]%1==0)
       {a[i][j]=abs(a[i][j]);}
   if (!a[i][j]%1==0)
       {a[i][j]=round(a[i][j]);}
   fprintf (fp1,"%d ",a[i][j]);
  }
  fprintf (fp1,"\n");
 }
 
 fclose (fp);
 fclose (fp1);
 return 0;
}
nonedark2008
624 / 502 / 92
Регистрация: 28.07.2012
Сообщений: 1,343
01.04.2013, 00:52     Файлы. Считать с файлового документа студентов с датой рождения,отсортировать по возрасту и записать... #7
%d - целое число, а у тебя переменные типа float. Замени везде %d на %f.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
01.04.2013, 02:30     Файлы. Считать с файлового документа студентов с датой рождения,отсортировать по возрасту и записать... #8
C++
1
float a[7][5];
C++
1
2
for (i=0;i<7;i++)
 {for (j=0;j<5;j++)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.04.2013, 08:50     Файлы. Считать с файлового документа студентов с датой рождения,отсортировать по возрасту и записать...
Еще ссылки по теме:

C++ Сортировка списка студентов по дате рождения (файл)
Операции с датой: вывести список студентов, кто не сдал книги в срок C++
Массив считать из файла, отсортировать по возрастанию и записать в новый файл C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Avicii
 Аватар для Avicii
2 / 2 / 0
Регистрация: 01.12.2012
Сообщений: 123
01.04.2013, 08:50  [ТС]     Файлы. Считать с файлового документа студентов с датой рождения,отсортировать по возрасту и записать... #9
Цитата Сообщение от nonedark2008 Посмотреть сообщение
%d - целое число, а у тебя переменные типа float. Замени везде %d на %f.
Вопрос такой появился,когда инициализируешь матрицу,допустим типа float, он в исходном файле ищет числа размерности float или использует только когда записывает в файл?По заданию исходные могут быть десятичными,а в конечном файле целыми.
Вроде получилось,спасибо,только в конечном результате выводит числа с шестью нулями после точки ,примерно так 6.000000. Это из-за типа float? Пробовал с типом double ,не распознает,наверно у этого типа свой спецификатор.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
#include <stdio.h>
#include <cmath>
#include <stdlib.h>
using namespace std;
 
int main()
{int i,j;
 float a[7][5];
 FILE *fp,*fp1;
 fp=fopen("ops2.txt","rt");
 fp1=fopen("rez.txt","wt");
 for (i=0;i<7;i++)
 {for (j=0;j<5;j++)
  {fscanf (fp,"%f ",&a[i][j]);
   if (fmod(a[i][j],1)==0)
       {a[i][j]=abs(a[i][j]);}
   if (!fmod(a[i][j],1)==0)
       {a[i][j]=round(a[i][j]);}
   fprintf (fp1,"%f ",a[i][j]);
  }
  fprintf (fp1,"\n");
 }
 
 fclose (fp);
 fclose (fp1);
 return 0;
}
Yandex
Объявления
01.04.2013, 08:50     Файлы. Считать с файлового документа студентов с датой рождения,отсортировать по возрасту и записать...
Ответ Создать тему
Опции темы

Текущее время: 12:29. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru