Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.06.2011, 01:12   #1
Shen`
Новичок
Джуниор
 
Регистрация: 14.06.2011
Сообщений: 3
По умолчанию Не работает gets() в С++

Помогите, пожалуйста!!!
Задача: У администратора железнодорожных касс хранится информация о свободных местах в поездах. Информация представлена в следующем виде: номер поезда, пункт назначения, время отправления, число свободных мест. Вывести информацию о поездах, в которых имеются свободные места до заданного пункта назначения.

Из функции void resc() выводится сообщение "Vvedite pynkt nazna4eniya", но gets не срабатывает.. сразу же выводит информацию о поездах, почему?? что не так сделала ?

Код:
Код:
#include <iostream.h>    // 6-я версия Builder
#include <iomanip.h>
#include <string.h>
#include <conio.h>
#include <stdlib.h>
#include <stdio.h>

FILE *fl;
typedef struct               // ячейки структуры
{
char poezd[10], pynkt[20], vremya[10], mesta[5];
} TTrain;                                    

TTrain train[50];  // массив структур
char name[20];     // имя файла
int nst=0;         // число введенных структур
int menu();        // меню
void nnf();         // ввести имя файла
void newf();        // создать новый файл
void spisok();      // ввести список
void opf();         // открыть файл
void resc();        // вывести результат на экран
void resf();        // сохранить результат в файл

int main() {                              
  while(true) {
    switch(menu()) {
      case 1:nnf(); break;
      case 2:newf(); break;
      case 3:spisok(); break;
      case 4:opf(); break;
      case 5:resc(); break;
      case 6:resf(); break;
      case 7:return 0;
       default: "Viberite pravil`no!";
    }
    puts("Press any key to continue");
    getch();   system("cls");
  }
}

int menu() {        // меню
cout << "Viberite:" << endl;
cout << "1 - Vvod imya faila" << endl;
cout << "2 - Novij fail" << endl;
cout << "3 - Vvesti spisok" << endl;
cout << "4 - Otkrit` fail" << endl;
cout << "5 - Vivesti rezyl`tat" << endl;
cout << "6 - Sohranit` rezyl`tat v fail" << endl;
cout << "7 - Vihod" << endl;
 int i;
 cin >> i;
 return i;
}

void nnf() {         // ввести имя файла
  cout << "Vvedite imya faila" << endl;
  cin >> name;
}

void newf() {        // создать новый файл
  if ((fl=fopen(name,"wb"))==NULL) {
  cout << "Oshibka pri sozdanii" << endl;
  exit(1);
  }
  cout << "OK" << endl;
  fclose(fl);
}

void spisok() {      // ввести список
  if ((fl=fopen(name,"rb+"))==NULL) {
  cout << "Oshibka pri sozdanii" << endl;
  exit(1);
  }
  cout << "Vvedite koli4estvo poezdov" << endl;
  cin >> nst;

  for(int i=0; i<nst; i++) {
  cout << "Vvedite nomer poezda ";
  cin >> train[i].poezd;
  cout << "Vvedite pynkt nazna4eniya ";
  cin >> train[i].pynkt;
  cout << "Vvedite vremya otpravki ";                         
  cin >> train[i].vremya;
  cout << "Vvedite koli4estvo svobodnix mest ";
  cin >> train[i].mesta;
   fwrite(&train[i],sizeof(TTrain),1,fl);
  }
  fclose(fl);
}

void opf() {         // открыть файл
  if((fl=fopen(name,"rb"))==NULL) {
  cout << "Oshibka pri otkritii" << endl;
  exit(1);
  }
  nst=0; TTrain std;
  while(true) {
  int nwrt=fread(&std,sizeof(TTrain),1,fl);
  if(nwrt!=1) break;
  train[nst]=std;
  cout << setw(10) << train[nst].poezd << setw(10) << train[nst].pynkt << setw(10)
       << train[nst].vremya << setw(10) << train[nst].mesta << endl;
  nst++;
  }
  fclose(fl);
}

void resc() {        // вывести результат на экран
  char pnaz[10];        // интересующий пункт назначения
  puts("Vvedite pynkt nazna4eniya");
  gets(pnaz);
  for(int i=0; i<nst; i++) {
  if(strcmp(train[nst].pynkt,pnaz)==0)
    cout << setw(10) << train[i].poezd << setw(10) << train[i].vremya
    << setw(10) << train[i].mesta << endl;
  }
}

void resf() {        // сохранить результат в файл
  char namet[30];
  FILE *ft;
  cout << "Vvedite imya faila" << endl;
  cin >> namet;
  if ((ft=fopen(namet,"w"))==NULL) {
    cout << "Oshibka pri sozdanii faila" << endl;
    exit(1);
  }
  char s[80];
  char pnaz[20];
  cout << "Vvedite pynkt nazna4eniya" << endl;
  cin >> pnaz;
  for(int i=0; i<nst; i++) {
    if(train[i].pynkt==pnaz) {
      strcpy(s, train[i].poezd);
      strcat(s, "\n");
      fputs(s, ft);
    }
  fclose(ft);
  }
}
Shen` вне форума Ответить с цитированием
Старый 14.06.2011, 01:53   #2
nxnx
 
Регистрация: 19.11.2010
Сообщений: 3
По умолчанию

нужно использовать fgets() вместо gets()
если проблема останется, значит fgets()/gets() тут не причём и ошибка в чёмто другом
nxnx вне форума Ответить с цитированием
Старый 14.06.2011, 02:21   #3
Shen`
Новичок
Джуниор
 
Регистрация: 14.06.2011
Сообщений: 3
По умолчанию

Цитата:
Сообщение от nxnx Посмотреть сообщение
нужно использовать fgets() вместо gets()
если проблема останется, значит fgets()/gets() тут не причём и ошибка в чёмто другом
Исправила на:
void resc() { // вывести результат на экран
char pnaz[10], *p_naz; // интересующий пункт назначения
puts("Vvedite pynkt nazna4eniya");
p_naz = fgets(pnaz,10,fl);
for(int i=0; i<nst; i++) {
if(strcmp(train[nst].pynkt,p_naz)==0)
cout << setw(10) << train[i].poezd << setw(10) << train[i].vremya
<< setw(10) << train[i].mesta << endl;
}
}
Теперь программа выдает ошибку при попытке ввести "пункт назначения"
Shen` вне форума Ответить с цитированием
Старый 14.06.2011, 14:16   #4
Mandrivnyk
Software Developer
Участник клуба
 
Аватар для Mandrivnyk
 
Регистрация: 01.03.2011
Сообщений: 1,098
По умолчанию

Замени
Код:
puts("Vvedite pynkt nazna4eniya");
на
Код:
printf("Vvedite pynkt nazna4eniya");
должно заработать.
Дело в том, что puts() добавляет в конце печати символ новой строки, который и воспринимается следующим за этим gets().
А вообще -- раз уж подключаешь iostream, почему бы не воспользоваться cin и cout ?
Болтовня ничего не стоит. Покажите мне код. (c) Linus Torvalds
Помог ответ? -- Поставьте отзыв.
Выражения особой благодарности в рублевом эквиваленте отправлять сюда --> R269634919062

Последний раз редактировалось Mandrivnyk; 14.06.2011 в 14:20.
Mandrivnyk вне форума Ответить с цитированием
Старый 14.06.2011, 22:09   #5
Shen`
Новичок
Джуниор
 
Регистрация: 14.06.2011
Сообщений: 3
По умолчанию

Цитата:
Сообщение от Mandrivnyk Посмотреть сообщение
Замени
Код:
puts("Vvedite pynkt nazna4eniya");
на
Код:
printf("Vvedite pynkt nazna4eniya");
должно заработать.
Дело в том, что puts() добавляет в конце печати символ новой строки, который и воспринимается следующим за этим gets().
А вообще -- раз уж подключаешь iostream, почему бы не воспользоваться cin и cout ?
решила поэкспериментировать, закомментила все что было в функции до gets, оставила только char pnaz[10]; - результат тот же, gets не работал.. О_о

Нашла ошибку у себя.. было train[nst].pynkt, а надо train[i].pynkt..
И все таки вернулась к cin и cout, все заработало!.

Спасибо, тем кто пытался помочь) мир не без добрых людей
Shen` вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему программа на С++ не работает с локальным описанием массива, но работает с глобальным? >>STINGER<< Помощь студентам 4 08.03.2011 09:56
почему интеренет на Xp не работает, а на семерке работает Lenura Windows 18 04.10.2010 12:04
TP7 чтение из файла, работает но не работает!? Qousio Помощь студентам 7 02.06.2009 09:37
Библиотека НЕ работает с 2008, но работает с 2000 SQL namenike Общие вопросы C/C++ 0 26.05.2009 11:04
Проблема с UserForm. То работает, то НЕ работает Maxx Microsoft Office Excel 6 19.11.2008 14:51