Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Noirman
0 / 0 / 1
Регистрация: 03.03.2009
Сообщений: 31
#1

Сравнение строк в структуре, чтение из файла - C++

05.03.2013, 16:18. Просмотров 1210. Ответов 2
Метки нет (Все метки)

Требуется написать программу, которая считывает из файла данные о студентах, сортирует их по фамилии и выводит их на экран. Далее нужно найти однофамильцев в группе и вывести данные о них на экран. Проблемы, собственно, две:
1. Не могу сделать чтение файла через eof (только статичное определение числа записей).
2. Функция поиска однофамильцев (void poisk()) работает неправильно.

Подскажите, что я сделал неправильно?

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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#include <iostream>
#include <fstream>
#include <windows.h>
 
using namespace std;
 
struct student
{
    char fam[20];
    int vozrast;
    char gruppa[5];
    double ball;
};
 
 
void read(student *stud, int n, int i)
{
 ifstream in("file.txt");  
    if(!in)
    {
        cout<<"File can not be open\n"; 
       
    }                                          
  
    
      for(i = 0; i < n; i++)
    { 
    in >> stud[i].fam >> stud[i].vozrast >> stud[i].gruppa >> stud[i].ball;
   }
 
}
 
 
 void sort(student *stud, int n, int i, int j,student swap )
 {
    
    for(i = 0; i < n; i++)
      for(j = i + 1; j < n; j++)
       if (strcmp (stud[i].fam, stud[j].fam) > 0)
    
    {
        swap = stud[i];
        stud[i] = stud[j];
        stud[j] = swap;
    }
 }
 
 void out(student *stud,int n, int i)
{
    for(i = 0; i < n; i++)
   
        for(i = 0; i < n; i++)
    { 
    cout << stud[i].fam << '\t' << stud[i].vozrast << '\t' <<  stud[i].gruppa << '\t' << stud[i].ball; 
    
     cout << endl;
    }
}
 
 void poisk(student *stud, int n, int i, int j)
{
    for(i = 0; i < n; i++)
    for(j = i + 1; j < n; j++)
    if (strcmp (stud[i].fam, stud[j].fam) == 0)
    {
       cout << stud[i].fam << '\t' << stud[i].vozrast << '\t' <<  stud[i].gruppa << '\t' << stud[i].ball;
cout << endl;
    }
 
}
 
 void poisk1(student *stud, int n, int i, char fama[20])
            {
            cout << "Enter surname" << endl;
    cin >> fama;
 
    for(i = 0; i < n; i++)
  
 if (strcmp (fama, stud[i].fam) == 0)
    {
    
     cout << stud[i].fam << '\t' << stud[i].vozrast << '\t' <<  stud[i].gruppa << '\t' << stud[i].ball; 
             cout << endl;
 
    }
            }
 
 void main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
 
student swap;  
int  i,j,k;
int key=0, n=8;
char fama[20];
 
student *stud = new student [n];
 
do
    {
        cout<<"1.Students\n2.Surname\n3.Search\n0.Exit\n";
        cin>>key;cin.ignore(1);
        switch(key)
        {
        case 1:
            cout << endl << "Surname Age Group Ball" << endl << endl;
            read(stud,n,i);
            sort(stud,n,i,j,swap);
            out(stud,n,i);
            break;
        case 2:
           read(stud,n,i);
           poisk(stud,n,i,j);
            break;
        case 3:
            read(stud,n,i);
            poisk1(stud,n,i,fama);
           break;
         case 0:
           break;
       
        }
 
    }while(key!=0);
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.03.2013, 16:18
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Сравнение строк в структуре, чтение из файла (C++):

Сравнение строк в структуре
смысл таков- я ввожу строку char nomerP, и эта строка должна сравниться с char...

Сравнение строк в структуре
Помогите, пожалуйста. Задается структура &quot;Фильм&quot;: вводится название фильма,...

Cтроки, сравнение, чтение из файла
Имеется файл .тхт с содержанием примерно следующего вида: 192.168.0.1...

Сравнение переменных или чтение с файла?
После тестировки, выяснилось, что проблема возникает в строке указаной...

Чтение из файла в список, сравнение с элементами списка
Здравствуйте! Стыдно спрашивать такие нюансы, но все же приходится, ибо в мою...

Чтение и сравнение символов из файла без использования массива
Здравствуйте, подскажите, как можно реализовать посимвольное чтение 2-х (3-х)...

2
Noirman
0 / 0 / 1
Регистрация: 03.03.2009
Сообщений: 31
05.03.2013, 16:38  [ТС] #2
Файл, с которого программа считывает данные.
0
Вложения
Тип файла: txt file.txt (169 байт, 31 просмотров)
alsav22
5438 / 4833 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
06.03.2013, 07:22 #3
Кликните здесь для просмотра всего текста
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#include <iostream>
#include <fstream>
#include <windows.h>
 
using namespace std;
 
struct student
{
    char fam[20];
    int vozrast;
    char gruppa[5];
    double ball;
};
 
void read(student *stud, int n)
{
    ifstream in("file.txt");  
    if(!in) cout << "File can not be open\n";
    
    for(int i = 0; i < n; i++)
        in >> stud[i].fam >> stud[i].vozrast >> stud[i].gruppa >> stud[i].ball;
}
 
void sort(student *stud, int n)
{
    student swap; 
    for(int i = 0; i < n; i++)
      for(int j = i + 1; j < n; j++)
        if (strcmp (stud[i].fam, stud[j].fam) > 0)
        {
            swap = stud[i];
            stud[i] = stud[j];
            stud[j] = swap;
        }
 }
 
void out(student *stud, int n)
{
        for(int i = 0; i < n; i++)
        { 
            cout << stud[i].fam << '\t' << stud[i].vozrast << '\t' <<  stud[i].gruppa << '\t' << stud[i].ball; 
            cout << endl;
        }
        cout << endl;
}
 
 void poisk(student *stud, int n)
{
    sort(stud, n);
    
    for(int i = 0; i < n; i++)
    {
        if (strcmp(stud[i].fam, stud[i + 1].fam) == 0)
        {
                for ( int j = i;  j < n && strcmp(stud[i].fam, stud[j].fam) == 0; j++)
                {
                    cout << stud[j].fam << '\t' << stud[j].vozrast << '\t' <<  stud[j].gruppa << '\t' << stud[j].ball;
                    cout << endl;
                }
                break;
        }
    }
    cout << endl;
}
 
void poisk1(student *stud, int n)
{
    cout << "Enter surname" << endl;
    char fama[20];
    cin >> fama;
    cout << endl;
    for(int i = 0; i < n; i++)
        if (strcmp(fama, stud[i].fam) == 0)
        {
            cout << stud[i].fam << '\t' << stud[i].vozrast << '\t' <<  stud[i].gruppa << '\t' << stud[i].ball; 
            cout << endl;
        }
    cout << endl;
}
 
int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
 
int key = 0, n = 8;
 
student *stud = new student[n];
 
do
{
    cout << "1.Students\n2.Surname\n3.Search\n0.Exit\n";
    cin >> key;
    cin.ignore(1);
    switch(key)
    {
    case 1:
        cout << endl << "Surname\tAge\tGroup\tBall" << endl << endl;
        read(stud, n);
        sort(stud, n);
        out(stud, n);
        break;
    case 2:
        read(stud, n);
        poisk(stud, n);
        break;
    case 3:
        read(stud, n);
        poisk1(stud, n);
        break;
    case 0:
        break;
       
    }
 
} while(key != 0);
 
system("pause");
return 0;
}


Добавлено через 30 минут
Или так:
Кликните здесь для просмотра всего текста
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#include <iostream>
#include <fstream>
#include <string>
#include <windows.h>
 
using namespace std;
 
struct student
{
    char fam[20];
    int vozrast;
    char gruppa[5];
    double ball;
};
 
student* read(int &n)
{
    ifstream in("file.txt");  
    if(!in)
    { 
        cout << "File can not be open\n";
        return 0;
    }
    else
    {
        for (n = 0;  ; n++)
        {
            string str;
            getline(in, str);
            if (in.eof()) break;
        }
        
        student *stud = new student[n]; // n - количество структур в файле
        
        in.clear();
        in.seekg(0);    
 
        for(int i = 0; i < n; i++)
            in >> stud[i].fam >> stud[i].vozrast >> stud[i].gruppa >> stud[i].ball;
            
        return stud;
    }
    
}
 
void sort(student *stud, int n)
{
    student swap; 
    for(int i = 0; i < n; i++)
      for(int j = i + 1; j < n; j++)
        if (strcmp (stud[i].fam, stud[j].fam) > 0)
        {
            swap = stud[i];
            stud[i] = stud[j];
            stud[j] = swap;
        }
 }
 
void out(student *stud, int n)
{
        for(int i = 0; i < n; i++)
        { 
            cout << stud[i].fam << '\t' << stud[i].vozrast << '\t' <<  stud[i].gruppa << '\t' << stud[i].ball; 
            cout << endl;
        }
        cout << endl;
}
 
 void poisk(student *stud, int n)
{
    for(int i = 0; i < n; i++)
    {
        if (strcmp(stud[i].fam, stud[i + 1].fam) == 0)
        {
                for ( int j = i;  j < n && strcmp(stud[i].fam, stud[j].fam) == 0; j++)
                {
                    cout << stud[j].fam << '\t' << stud[j].vozrast << '\t' <<  stud[j].gruppa << '\t' << stud[j].ball;
                    cout << endl;
                }
                break;
        }
    }
    cout << endl;
}
 
void poisk1(student *stud, int n)
{
    cout << "Enter surname" << endl;
    char fama[20];
    cin >> fama;
    cout << endl;
    for(int i = 0; i < n; i++)
        if (strcmp(fama, stud[i].fam) == 0)
        {
            cout << stud[i].fam << '\t' << stud[i].vozrast << '\t' <<  stud[i].gruppa << '\t' << stud[i].ball; 
            cout << endl;
        }
    cout << endl;
}
 
int main()
{
 SetConsoleCP(1251);
 SetConsoleOutputCP(1251);
 
 int n;
 
 student *stud = read(n);
 
 if (stud)
 {
    sort(stud, n);
    
    int key = 0; 
    do
    {
        cout << "1.Students\n2.Surname\n3.Search\n0.Exit\n";
        
        cin >> key;
        switch(key)
        {
        case 1:
            cout << endl << "Surname\tAge\tGroup\tBall" << endl << endl;
            out(stud, n);
            break;
        case 2:
            poisk(stud, n);
            break;
        case 3:
            poisk1(stud, n);
            break;
        case 0:
            break;
        }
    } while (key != 0);
 
    delete [] stud;
 }
 
 system("pause");
 return 0;
}
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.03.2013, 07:22
Привет! Вот еще темы с решениями:

Сравнение строк файла с введенными пользователем
#include &lt;iostream&gt; #include &lt;string&gt; #include &lt;fstream&gt; #include &lt;cstdio&gt; ...

Чтение строк из файла
Добрый день имеется ряд вопросов касательно чтения строк из текстового файла....

Чтение строк из файла
struct Questions { char quest; }QuestList; void main() { int...

Чтение строк из файла
Мне нужно читать строки из фалйа разной длинны тоесть может быть вобще...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru