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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.05.2010, 02:17   #1
staaas1k
 
Регистрация: 04.05.2010
Сообщений: 3
По умолчанию проблема с отладкой

Вообщем суть программы угадывание буквы по введенным словам. Введенные слова должны проверять на наличие в файле(словарь 35 тысяч слов каждое с новой строки !!ДОЛЖЕН БЫТЬ ПО АЛФАВИТУ!!). При отстутствии либо добавить либо вводить другое.

Вот собственно программа. Работает как то через раз, то повиснит во время добавления слова, то нормально добавит и отформатирует словарь, то вообще сотрет весь файл и ничего туда не запишет)

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

#define STRLEN 36

char** GetData(char* name, int* size) //Функция копирования файла в динамически массив
{
    FILE*  file;
    char** text = NULL;
    int    last;
    char   buf[STRLEN];

    *size = 0;

    file  = fopen(name, "rt");
    while(fgets(buf, STRLEN, file) != NULL)
    {
	last = strlen(buf) - 1;
	if(buf[last] == '\n')
	    buf[last] = '\0';

	text        = (char**)realloc(text, sizeof(char*) * (*size + 1));
	text[*size] = (char*)malloc(sizeof(char) * (strlen(buf) + 1));
	strcpy(text[(*size)++], buf);
    }

    fclose(file);

    return text;
}

int searchword(char *word) //Функция поиска слова в словаре
 {
  clrscr();
  int flag=0;
  const int len = 35;
  char line[len];

  memset(&line,NULL,sizeof(line)); //Очистка массива line
  ifstream f("test.txt",ios::in|ios::nocreate); //Открытие файла

  while (!f.eof()) {
    f.getline(line,len);
    if(strcmp(word,line)==0) {
      flag=1;
      break;
    }
  }
  return flag;
 }

int addword(char *word) //Функция добавления слова
 {
  char** data;
  char* filename;
  char *temp;
  int i=0,count=0;
  FILE*f,*f2;

  f=fopen("test.txt","a+");
  fputs(word,f);
  fprintf(f2,"\n");
  fclose(f);

  filename="test.txt";
  data=GetData(filename,&count);

  for(i=0;i<count;i++)//Сортировка пузырьковым методом
     {
      if(strcmp(data[i],data[i+1])>0)
	 {
	  strcpy(temp,data[i]);
	  strcpy(data[i],data[i+1]);
	  strcpy(data[i+1],temp);
	  i=0;
	 }
     }

  f2=fopen("test.txt","w");

  for(i=0;i<count;i++) //Запись в файл
      fprintf(f2,"%s\n",data[i]);

  for(i=0;i<count;i++) //Очистка памяти
      free(data[i]);
  free(data);

  fclose(f2);

  return 0;
 }

void main() //Главная функция
  {
   clrscr();
   int count=0,z=0,lt=0,flag=0;
   char ALF[32]={"абвгдеёжзиклмнопрстуфхцчшщъыьэюя"};
   char answer,answer2;
   char letter[1],word[35];
   memset(&letter,NULL,sizeof(letter));
   memset(&word,NULL,sizeof(word));
    do
       {
	randomize();
	lt=random(32)+1;
	cout << "Буква: " << ALF[lt] << "\n";

	do
	  {

	   do
	     {
	      cout << "Введите слово: ";
	      cin >> word;
	      flag=searchword(word);
	      if(flag==0)
		 {
		  cout << "Слово отсутствует в словаре.";
		  do
		    {
		     cout << "Добавить его в словарь? Y/N > ";
		     cin >> answer2;
		    }
		  while(answer2!='Y'&&answer2!='N');
		  if(answer2=='Y')
		     {
		      flag=1;
                      addword(word);
		     }
		  else
		     {
		      flag=0;
		     }
		 }
	      else
		 {
		  cout << "Слово присутствует в словаре.";
		 }

	     }
	   while(flag==0);
	   for(int i=0;i<35;i++)
	      {
	       if(word[i]==ALF[lt])
		  {
		   count++;
		  }
	      }
	   cout << "Загаданная буква встречается " << count << " раз";
	   count=0;
	   cout << "\nЕщё попытка или угадываем?";
	   cout << "\nY-угадываем N-ещё попытка";
	   cout << "\n>>>";
	   cin >>answer;
	  }
	while(answer=='N');
	cout << "\nКакая буква?";
	cin >> letter[0];
	if(ALF[lt]==letter[0])
	   {
	    cout << "Правильно!";
	   }
	else
	    cout << "Не угадали :(";
	cout << "Съиграть ещё раз? (1-Да|2-Нет) ";
	cin >> z;
	clrscr();
     }
   while(z==1);
  }
staaas1k вне форума Ответить с цитированием
Старый 05.05.2010, 10:55   #2
mrChester
Я
Форумчанин
 
Аватар для mrChester
 
Регистрация: 24.04.2010
Сообщений: 693
По умолчанию

Попробуй так

Код:
#define STRLEN 36

char** GetData(char* name, int* size) //Функция копирования файла в динамически массив
{
    FILE*  file;
    char** text = NULL;
    int    last;
    char   buf[STRLEN];

    *size = 0;             //size проверь возможно после выхода из функции возвращает неправильное значение

    file  = fopen(name, "rt");
    while(fgets(buf, STRLEN, file) != NULL)
    {
	last = strlen(buf) - 1;
	if(buf[last] == '\n')
	    buf[last] = '\0';

	text        = (char**)realloc(text, sizeof(char*) * (*size + 1));
	text[*size] = (char*)malloc(sizeof(char) * (strlen(buf) + 1));
	strcpy(text[*(size)++], buf);
    }

    fclose(file);

    return text;
}


int addword(char *word) //Функция добавления слова
 {
  char** data;
  char* filename;
  char *temp;
  int i=0,count=0;
  FILE *f;

  f=fopen("test.txt","rw");
  fprintf(f,"%s\n",word);               //возможно что так fprintf(f,"\n%s",word);
  fclose(f);

  filename="test.txt";
  data=GetData(filename,&count);

  for(i=0;i<count;i++)//Сортировка пузырьковым методом
     {
      if(strcmp(data[i],data[i+1])>0)
	 {
	  strcpy(temp,data[i]);
	  strcpy(data[i],data[i+1]);
	  strcpy(data[i+1],temp);
	  i=0;
	 }
     }

  f=fopen("test.txt","rw");

  for(i=0;i<count;i++) //Запись в файл
      fprintf(f,"%s\n",data[i]);

  for(i=0;i<count;i++) //Очистка памяти
      free(data[i]);
  free(data);

  fclose(f2);

  return 0;
 }
Все персонажи вымышлены, все совпадения случайны.
Если жизнь игра, тогда я её разработчик ©.
mrChester вне форума Ответить с цитированием
Старый 05.05.2010, 15:11   #3
staaas1k
 
Регистрация: 04.05.2010
Сообщений: 3
По умолчанию

Код:
  f=fopen("test.txt","rw");
  fprintf(f,"%s\n",word);               //возможно что так fprintf(f,"\n%s",word);
  fclose(f);
а разве он не будет пересоздавать файл с параметром rw?
staaas1k вне форума Ответить с цитированием
Старый 05.05.2010, 15:20   #4
mrChester
Я
Форумчанин
 
Аватар для mrChester
 
Регистрация: 24.04.2010
Сообщений: 693
По умолчанию

Цитата:
Сообщение от staaas1k Посмотреть сообщение
а разве он не будет пересоздавать файл с параметром rw?
таким образом он открывает файл для чтения и записи

Код:
  f=fopen("test.txt","r+"); //можно и так, а насчет "a+" не уверен
Все персонажи вымышлены, все совпадения случайны.
Если жизнь игра, тогда я её разработчик ©.
mrChester вне форума Ответить с цитированием
Старый 05.05.2010, 16:36   #5
staaas1k
 
Регистрация: 04.05.2010
Сообщений: 3
По умолчанию

"a" это запись в конец
staaas1k вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Просьба помочь с отладкой сайта на ASP.NET АААААлександр ASP.NET 2 18.02.2010 09:13
Проблема с рамами/Проблема с ЖД DRAGGER Компьютерное железо 6 04.01.2009 23:37
Проблемы с отладкой программы lenuxoid Общие вопросы Delphi 5 22.12.2008 08:30