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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.07.2012, 22:26   #1
zubber94
Пользователь
 
Регистрация: 28.03.2012
Сообщений: 14
По умолчанию С++ Текстовые файлы

Необходимо написать программу проверки орфографии: жи-ши, ча-ща, чу-щу. Интерфейс в виде меню, возможность выбора "исправить ошибки" или, если пользователь не хочет исправлять, то - нет. Возможность вводить данные как с клавиатуры, так и считывать из файла.

Проблема такая: Если я буду использовать только ввод с клавиатуры (сколько угодно раз), программа работает нормально. Если же я хоть раз выберу считывание из файла, все считается нормально, то есть содержимое проверится на ошибки и т.п. НО! После этого функция "3. Выход." выдает ошибку типа "Память нее может быть written". Это происходит только если я выберу ввод из файла.

Содержимое файла, из которого считываю: "жызнь чяща чащя щявель шыло шыть" (в файле без кавычек).

Код:
#include <stdio.h>
#include <iostream.h>
#include <string.h>
#include <windows.h>

void check_spelling(char *), do_spelling(char *), Inp_key(), Inp_file(), quit();
void(*muk[])()={ Inp_key, Inp_file, quit };
int menu()
{
	char sym;
	system("pause");
	system("cls");
	
	do
	{
		cout<<"1. Ввести слова с клавиатуры\n2. Читать из файла\n3. Выход\n";
		cout<<"Ваш выбор: ";
		cin>>sym;
		cout<<endl;
	}
	while(!strchr("123",sym));
	
	return sym-49;
}

void main()
{	
	SetConsoleOutputCP(1251);
	SetConsoleCP(1251);
	
	for(;;)
	(*muk[menu()])();
}

void Inp_file()
{
	int v=0;
	char *s=new char[];
	FILE *ft=fopen("F_SPELLING.txt","r+");

	while(!feof(ft))
		fgets(s,255,ft);
	fclose(ft);
	
	cout<<"\nДо проверки: "<<s<<endl;
	check_spelling(s);
	cout<<"1. Исправить ошибки\n2. Не исправлять ошибки.\n";
	cin>>v;

	FILE *ftn=fopen("F_RIGHT_SPELLING.txt", "w");
	if(v==1)
	{
		do_spelling(s);
		fputs(s,ftn);
		cout<<"После проверки: "<<s<<endl;
	}
	fcloseall();
}

void Inp_key()
{
	int v=0;
	char s[255];

	cout<<"Введите слова: ";
	cin.get();
	cin.getline(s,255);

	cout<<"\nДо проверки: "<<s<<endl;
	check_spelling(s);
	cout<<"\n1. Исправить ошибки\n2. Не исправлять ошибки.\n";
	cin>>v;
	if(v==1)
	{
		do_spelling(s);
		cout<<"После проверки: \n"<<s<<endl;
	}
}

void quit()
{
	exit(0);
}

void do_spelling(char *s)
{
	for(int i=0; i<strlen(s); i++)
	{
		if(s[i]=='ж'&&s[i+1]!='и')
			s[i+1]='и';
		if(s[i]=='ш'&&s[i+1]!='и')
			s[i+1]='и';
		if(s[i]=='ч'&&s[i+1]!='а'&&s[i+1]!='у')
			s[i+1]='а';
		if(s[i]=='щ'&&s[i+1]!='а'&&s[i+1]!='у')
			s[i+1]='а';
		if(s[i]=='ч'&&s[i+1]!='у'&&s[i+1]!='а')
			s[i+1]='у';
		if(s[i]=='щ'&&s[i+1]!='у'&&s[i+1]!='а')
			s[i+1]='у';
	}
}

void check_spelling(char *s)
{
	int count=0;
	for(int i=0; i<strlen(s); i++)
	{
		if(s[i]=='ж'&&s[i+1]!='и')
			count++;
		if(s[i]=='ш'&&s[i+1]!='и')
			count++;
		if(s[i]=='ч'&&s[i+1]!='а'&&s[i+1]!='у')
			count++;
		if(s[i]=='щ'&&s[i+1]!='а'&&s[i+1]!='у')
	     	count++;
	}
	cout<<"У Вас "<<count<<" ошибок!"<<endl;
}
Заранее спасибо!

Последний раз редактировалось zubber94; 09.07.2012 в 11:01.
zubber94 вне форума Ответить с цитированием
Старый 09.07.2012, 13:29   #2
zubber94
Пользователь
 
Регистрация: 28.03.2012
Сообщений: 14
По умолчанию

Может немного непонятно описал суть проблемы?

Значит. Я запускаю программу, появляется меню. Выбираю пункт "1. Ввести слова с клавиатуры", после чего запускается функция Inp_key. По завершении функции снова появляется меню. Нажимаю "3. Выход." и все нормально закрывается. При этом я могу сколько угодно раз использовать "1. Ввести слова с клавиатуры" и ничего не нарушится.

Если же я хоть раз выбираю пункт "2. Читать из файла.", почле которого выполняется функция Inp_file, то, когда функция завершена и снова на экране меню, я нажимаю "3. Выход" и вылетает ошибка "Инструкция по адресу "0х00405а50е" обратилась по адресу "0xf820fceb". Память не может быть "written"."
zubber94 вне форума Ответить с цитированием
Старый 09.07.2012, 13:41   #3
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Цитата:
Код:
char *s=new char[];
Пустые скобки???
Somebody вне форума Ответить с цитированием
Старый 09.07.2012, 14:26   #4
zubber94
Пользователь
 
Регистрация: 28.03.2012
Сообщений: 14
По умолчанию

Цитата:
Сообщение от Somebody Посмотреть сообщение
Пустые скобки???
Спасибо, заработало. Поменял на:

char s[255];

А скобки пустые... Мне так показали создание строки неизвестного размера. Уже использовал, работало нормально.
zubber94 вне форума Ответить с цитированием
Старый 09.07.2012, 14:33   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
char *s=new char[];
Замени на char s[255]; Ведь ты все равно по 255 символов считываешь.

P.S. опоздал...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
текстовые файлы Funy Помощь студентам 1 16.01.2012 16:38
Текстовые файлы. dima-intro Помощь студентам 3 31.12.2010 16:09
Текстовые файлы Asira Помощь студентам 3 29.06.2010 10:50
Текстовые файлы ponchikpk Помощь студентам 1 23.03.2009 22:02