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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.04.2011, 14:47   #1
Renat21
Пользователь
 
Регистрация: 04.02.2011
Сообщений: 12
По умолчанию Ошибка в программе C

Привет всем! У меня вот такой вопрос по языку Turbo C Есть у меня одна функция в программе:

Код:
void NumMarsh(FILE *f)
{ struct marsh z;
  int max=0,fmax;
  char fnum[DL_NUM];
  rewind(f);
  while(fgets((char *)&z,sizeof(struct marsh),f)!=NULL)
  {
    z.times[DL_TIME-1]='\0';
    fmax=atoi(z.times);
    if(fmax>max)
    {
      strcpy(fnum,z.num);
      max=atoi(z.times);
    }
  }
  printf("\nНомер самого длинного маршрута:\n%s",z.num);
}
При пошаговом выполнении да вообще при выполнении у меня программа вылетает И когда я просматриваю результат через User Screen то там можно увидеть следующее сообщение:
Abnormal program termination
Может быть я что-то не так делаю? Объясните пожалуйста что мне в этой ситуации делать? И есть решение этой проблемы? Заранее спасибо!

Последний раз редактировалось Stilet; 02.04.2011 в 16:15.
Renat21 вне форума Ответить с цитированием
Старый 02.04.2011, 16:17   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

А на какой строке она вылетает?
Цитата:
struct marsh z;
Если не секрет это что означает?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.04.2011, 16:26   #3
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,336
По умолчанию

2Stilet
определяем переменную z, которая является структурой marsh. сразу видно, на си ты не писал

2Renat21
мало кода, так не понять. кидай весь проект
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 02.04.2011, 16:33   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
сразу видно, на си ты не писал
Непрофессионально писал... Чисто для себя но без глубокого занурення
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.04.2011, 16:41   #5
Renat21
Пользователь
 
Регистрация: 04.02.2011
Сообщений: 12
По умолчанию

Вот вся программа

Код:
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>

#define DL_NUM 4
#define DL_NM 2
#define DL_BEGIN 15
#define DL_END 15
#define DL_TIME 3

struct marsh
{ char num[DL_NUM];
  char name[DL_NM];
  char begin[DL_BEGIN];
  char end[DL_END];
  char times[DL_TIME+2];
};

void AllMarsh(FILE *f);
void NumMarsh(FILE *f);
void KolMarsh(FILE *f);


int main()
{ char n;
  FILE *f;
  f=fopen("MARSH.txt","r");
  if(f==NULL)
  { puts("Файл MARSH.txt не найден!");
    getch();
    return 1;
  }
  do
  { clrscr();
    puts("==================================");
    puts("Введите номер пункта меню:");
    puts("----------------------------------");
    puts("1 - Вывод списка всех маршрутов");
    puts("\tиз пункта А (или в пункт А)");
    puts("2 - Вывод номера самого длинного");
    puts("\tмаршрута из А (или в А)");
    puts("3 - Вывод количества маршрутов");
    puts("\tкаждого вида (из А или в А)");
    puts("4 - Выход");
    puts("----------------------------------");
    n=getche();
    switch(n)
    { case '1': AllMarsh(f);break;
      case '2': NumMarsh(f);break;
      case '3': KolMarsh(f);break;
      case '4': break;
      default: puts("\nНужно вводить номера пунктов меню от 1 до 
4");
    }
    if(n!='4')
    { puts("\nДля прдолжения нажмите любую клавишу");
      getch();
    }

  }
  while(n!='4');
  fclose(f);
  return 0;
}

void AllMarsh(FILE *f)
{ struct marsh tz;
  char zm[DL_BEGIN],
       fmb[DL_BEGIN],
       fme[DL_END];
  int i,
      n=0;
  rewind(f);
  puts("\nВведите начальный или конечный маршрут:");
  gets(zm);
  if(*zm!=NULL)
  {
   while(fgets((char *)&tz,sizeof(struct marsh),f)!=NULL)
   { strncpy(fmb,tz.begin,DL_BEGIN-1);
     strncpy(fme,tz.end,DL_END-1);
     i=strlen(zm);
     fmb[i]='\0';
     fme[i]='\0';
     if(strcmp(zm,fmb)==0 || strcmp(zm,fme)==0)
     {
       if(n==0)
       { puts("|--|-------|---|-----------------|----------------|--------------|");
	 puts("|ь | Номер |Вид| Начальный пункт | Конечный 
пункт | 
Время в пути |");
	 puts("|--|-------|---|-----------------|----------------|--------------|");
       }
       tz.num[DL_NUM-1]='\0';
       tz.name[DL_NM-1]='\0';
       tz.begin[DL_BEGIN-1]='\0';
       tz.end[DL_END-1]='\0';
       tz.times[DL_TIME-1]='';
       printf("|%d.| %5s |%3s| %16s|%16s|\t%s\t 
|\n",++n,tz.num,tz.name,tz.begin,tz.end,tz.times);
     }
   }
 }
 else
  puts("Ошибка! Введенна пустая строка!");
 if(n==0)
  puts("Заданного маршрута в файле не обнаружено!");
 else
  
puts("|__|_______|___|_________________|________________|___
_
__________|");
}

void NumMarsh(FILE *f)
{ struct marsh z;
  int max=0,fmax;
  char fnum[DL_NUM];
  rewind(f);
  while(fgets((char *)&z,sizeof(struct marsh),f)!=NULL)
  {
    z.times[DL_TIME-1]='\0';
    fmax=atoi(z.times);
    if(fmax>max)
    {
      strcpy(fnum,z.num);
      max=atoi(z.times);
    }
  }
  printf("\nНомер самого длинного маршрута:\n%s",z.num);
}

void KolMarsh(FILE *f)
{ rewind(f);
  puts("\nФункция KolMarsh вызвана!");
}
Дело в том, что когда нажимаешь на 1 все работает нормально а при нажатии на 2 вылетает Почему?

Последний раз редактировалось Stilet; 02.04.2011 в 17:00.
Renat21 вне форума Ответить с цитированием
Старый 02.04.2011, 17:23   #6
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Пробежался взглядом: вы читаете структуру из текстового файла, где символ может совпасть с разделителем; попробуйте:
Код:
f=fopen("MARSH.txt","rb");
И вместо fgets() fread() (и fwrite(), если нужно где-то).
Ссылки (у меня что-то их добавление не работает):
http://www.cplusplus.com/reference/clibrary/cstdio/fread/
http://www.cplusplus.com/reference/clibrary/cstdio/fwrite/
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 02.04.2011, 18:00   #7
Renat21
Пользователь
 
Регистрация: 04.02.2011
Сообщений: 12
По умолчанию

Попробовал переустановить программу Turbo C Теперь ошибка Abnormal termination program не выходит, а при запуске программы и при нажатии на клавишу 2 программа не заканчивает свою работу Нажимаю Enter ничего не происходить Пробую заново компилировать программу пошагово и просматриваю в Watch'е структуру tz, получается так что в функции NumMarsh на строчке while(fgets((char *)&z,sizeof(struct marsh),f)!=NULL) начинает считывать файл не с первой строки, а с последней хотя у меня там функция ставящая позицию на начало файла есть (rewind(f)) Почему в этой функции зацикливается, а в первой работает нормально не могу понять помогите, пожалуйста?
Renat21 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка в программе. v1le Помощь студентам 3 26.10.2010 17:00
Ошибка пв программе aiktz Помощь студентам 0 24.10.2010 21:48
Ошибка в программе misher Общие вопросы Delphi 12 01.09.2010 19:11
Ошибка в программе. T@tali Паскаль, Turbo Pascal, PascalABC.NET 15 25.05.2010 13:36