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

Структуры - C++

Восстановить пароль Регистрация
 
_Eldar_
 Аватар для _Eldar_
44 / 29 / 3
Регистрация: 31.10.2009
Сообщений: 200
17.01.2010, 10:20     Структуры #1
Привет всем. Я описал структуру и заполняю массив из 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
#include <string.h>
#include <iostream.h>
#include <windows.h>
 
int main (){
 
   SetConsoleCP(1251);
   SetConsoleOutputCP(1251);
 
   const int l_fio = 20;
 
   struct student{
      char fio[l_fio+1];
      int  group;
      int  value[5];
   };
 
   student stud[3];
 
   for(int i=0; i<3; i++){
 
      cout << "\nВведите ФИО: ";
      cin.get(stud[i].fio, l_fio);
      stud[i].fio[l_fio+1] = '\0';
      cout << "\nВведите группу: ";
      cin >> stud[i].group;
      cout << "\nВведите оценки(5шт.): ";
      for(int j=0; j<5; j++) cin >> stud[i].value[j];
 
   }
   cout << "\nКонтрольный вывод: \n";
   for(int i=0; i<3; i++){
 
      cout << "\nФИО: " << stud[i].fio;
      cout << "\nГруппа: " << stud[i].group;
      cout << "\nОценки(5шт.): ";
      for(int j=0; j<5; j++) cout << stud[i].value[j] << " ";
      cout << "\n\n";
   }
 
   return 0;
 
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.01.2010, 10:20     Структуры
Посмотрите здесь:

C++ Структуры
Структуры С++ C++
C++ СТРУКТУРЫ
C++ Структуры
C++ Структуры
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
17.01.2010, 10:23     Структуры #2
C++
1
cin.getline(stud[i].fio, l_fio);
_Eldar_
 Аватар для _Eldar_
44 / 29 / 3
Регистрация: 31.10.2009
Сообщений: 200
17.01.2010, 10:27  [ТС]     Структуры #3
теперь ввод продолжается, но ФИО 2-ой и 3-ий раз я не могу ввести, сразу на группу переходит
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
17.01.2010, 11:13     Структуры #4
C++
1
2
        cin >> stud[i].value[j];
    cin.get();
вообще там можно как-то чистить
cin.clear() или cin.ignore() чтоли

Добавлено через 16 минут
cin.clear() - это другое, а cin.ignore() - то, что надо

C++
1
2
        cin >> stud[i].value[j];
    cin.ignore();
_Eldar_
 Аватар для _Eldar_
44 / 29 / 3
Регистрация: 31.10.2009
Сообщений: 200
17.01.2010, 11:17  [ТС]     Структуры #5
да работает в принципе и с cin.get(),СПАСИБО, только я так и не понял саму причину ошибки (

Добавлено через 1 минуту
и что игнорирует cin.ignore() ?
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
17.01.2010, 11:21     Структуры #6
когда вводишь последнюю оценку, перевод строки после неё идёт в следующий запрос fio
cin.ignore() видимо пропускает всё, что до его вызова в потоке (не думаю, что он пропускает только пробельные)
_Eldar_
 Аватар для _Eldar_
44 / 29 / 3
Регистрация: 31.10.2009
Сообщений: 200
17.01.2010, 11:29  [ТС]     Структуры #7
СПАСИБО ЗА ПОМОЩЬ!)
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
17.01.2010, 11:30     Структуры #8
в курсе, что, благодаря getline, stud[i].fio[l_fio+1] = '\0'; можно убрать
и вообще
C++
1
    cin.getline(stud[i].fio, sizeof stud[i].fio);
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
17.01.2010, 11:40     Структуры #9
cin.clear() - сбрасывает флаги состояния потока (eof, fail, bad,)
cin.ignore() - удаляет символ из потока
cin.ignore(n, 'delim') - удаляет n символов из потока или до символа 'delim' (если он встретится раньше)
cin.ignore(n) - удалаяет n сиволов из потока ('delim' по умолчанию равен eof)

Добавлено через 2 минуты
Можно применить такую конструкцию для очищения потока
C++
1
2
3
4
5
while (!cin.eof())
{
   cin.ignore();
}
cin.clear();
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
18.01.2010, 05:21     Структуры #10
C++
1
while (!cin.eof())
может зависнуть цикл (при ошибке чтения стандартного потока)
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
18.01.2010, 09:46     Структуры #11
Вместо eof можно использовать флаг fail.
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
18.01.2010, 11:31     Структуры #12
что-нибудь типа такого
C++
1
while (!(cin.eof() | cin.fail()))
C++
1
while (!cin.eof() && !cin.fail())
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
18.01.2010, 12:29     Структуры #13
Эксперименты показали, что пример оказался неудачным, т.к. cin.ignore() не изменяет флаги состояния потока((, также как и оператор взять из потока >>. Для функций getline и get можно так попытаться очистить поток
C++
1
2
3
4
5
if (cin.fail())
{
   cin.clear();
   while (cin.get() != '\n');
}
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
18.01.2010, 13:19     Структуры #14
C++
1
while (cin.get() != '\n');
этот может зависнуть, если не сможет прочитать
C++
1
while (cin.get(c) && c != '\n');
Добавлено через 3 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
#include <iostream>
 
using namespace std;
 
int main(void)
{
    char c;
    
    while (cin.get(c) && c != '\n')
        ;
        
    cout << "ok" << endl;
    
    return 0;
}
Код
[guest@station tmp]$ ./t2
lkajsdflkj.
ok
[guest@station tmp]$ echo abcd | ./t2
ok
[guest@station tmp]$ echo -n abcd | ./t2
ok
[guest@station tmp]$
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.01.2010, 14:08     Структуры
Еще ссылки по теме:

C++ Структуры
Структуры C++
C++ Структуры в С++

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

Или воспользуйтесь поиском по форуму:
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
18.01.2010, 14:08     Структуры #15
Ну если так пессимистично смотреть, тогда так
C++
1
2
3
4
5
6
7
8
9
if (cin.fail())
{
   cin.clear();
   while (!cin.fail());
   {
      cin.get();
   }
   cin.clear();
}
Yandex
Объявления
18.01.2010, 14:08     Структуры
Ответ Создать тему
Опции темы

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