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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.08.2009, 10:55   #1
new programmer
Новичок
Джуниор
 
Регистрация: 27.08.2009
Сообщений: 1
По умолчанию C++. Работа со строками и словами

Постановка моей задачи такова:
при помощи контейнера std::set разработать программу diff.exe, выводящую в output те слова из первого файла, которые есть во втором, но отсутствуют в третьем.
Например:
Файл 1:
=============
яблоко арбуз окунь шоколад окунь кот
=============

Файл 2:
=============
окунь магистраль кот яблоко снегирь арбуз
=============

Файл 3:
=============
студент снегирь кот яблоко весна
=============

В Output должно вывестись:
==============
арбуз окунь окунь
==============
в каталоге bin должны быть файлы для автоматической проверки программы.
синтаксис командной строки приложения:
diff.exe <файл1> <файл2> <файл3>

Вот что я написала:

Код:
#pragma warning(disable:4786)

#include <iostream> 
#include <fstream> 
#include <string>
#include <set>   

using namespace std;

void ReadWordsFromFile(char *sourceFileName, set<string> wordBase)
{
	ifstream input_file(sourceFileName); 
	char word[64] ;
	string currentWord;
	while (! input_file.eof()) 
		
	{ 
		input_file >> word;
		currentWord += word; 
		wordBase.insert(currentWord);
		currentWord = "";
	}
}

void ClosingTheFile(char *sourceFileName)
{
	ifstream input_file(sourceFileName);
	input_file.close();
}


int main(int argc, char * argv[]) 
{
	if (argc != 4)
	{
		cout << "Usage: diff.exe <file1> <file2> <file3>" << endl;
		cout << "Program searches for words\nfrom file1, which are in file2, but are absent in file3" << endl;
		cout <<	"and saves rezult in output." << endl;
		
		return 1;
	}
	
	set<string> wordBase2, wordBase3;
	ReadWordsFromFile(argv[2], wordBase2);
	ReadWordsFromFile(argv[3], wordBase3);

	ifstream input_file(argv[1]); 
	char word[64] ;
	string soughtWord;
	while (! input_file.eof()) 
		
	{ 
		input_file >> word;
		soughtWord += word;
		
		if (wordBase2.find(soughtWord) != wordBase2.end())
		{
			if (wordBase3.find(soughtWord) == wordBase3.end())
			{
				cout << soughtWord << ' ';
			}
		}
		soughtWord = "";
	}

	ClosingTheFile(argv[1]);
	ClosingTheFile(argv[2]);
	ClosingTheFile(argv[3]);

	return 0;
}
Вся проблема состоит в поиске слов с помощью метода find. (слова почему то не находятся и в output ничего не выводится) Помогите, пожалуйста, как это исправить?
new programmer вне форума Ответить с цитированием
Старый 27.08.2009, 16:36   #2
-iG-
Новичок
Джуниор
 
Регистрация: 22.06.2009
Сообщений: 2
По умолчанию

Вот работающий вариант:
Код:
#pragma warning(disable:4786)

#include <iostream> 
#include <fstream> 
#include <string>
#include <set>   

using namespace std;

void ReadWordsFromFile(char *sourceFileName, set<string> & wordBase)
{
	ifstream input_file(sourceFileName);
	string currentWord = "";
	while (!input_file.eof()) 		
	{ 
		input_file >> currentWord;
		wordBase.insert(currentWord);
		currentWord = "";
	}
}

void ClosingTheFile(char *sourceFileName)
{
	ifstream input_file(sourceFileName);
	input_file.close();
}


int main(int argc, char * argv[]) 
{
	if (argc != 4)
	{
		cout << "Usage: diff.exe <file1> <file2> <file3>" << endl;
		cout << "Program searches for words\nfrom file1, which are in file2, but are absent in file3" << endl;
		cout <<	"and saves rezult in output." << endl;
		
		return 1;
	}
	
	set<string> wordBase2, wordBase3;
	ReadWordsFromFile(argv[2], wordBase2);
	ReadWordsFromFile(argv[3], wordBase3);

	ifstream input_file(argv[1]);
	string soughtWord = "";
	set<string>::iterator it;
	
	while (!input_file.eof()) 
	{ 
		input_file >> soughtWord;
		it = wordBase2.find(soughtWord.c_str());
		if (it != wordBase2.end())
		{	
			it = wordBase3.find(soughtWord.c_str());		
			if (it == wordBase3.end())
			{
				cout << soughtWord.c_str() << ' ';
			}
		}
		soughtWord = "";
	}
	ClosingTheFile(argv[1]);
	ClosingTheFile(argv[2]);
	ClosingTheFile(argv[3]);

	return 0;
}
Основная ошибка была в том что ты в функцию заполнения множества передаешь множество не по ссылке. То есть ты передала множество в функцию, функция создала копию этого множества и заполнила эту копию, а оригинальное множество так и осталось пустым. Решение - передавать в ыункциюю множество по ссылке.
Еще для поиска слова нужно использовать итераторы set<string>::iterator it;
Есть еще несколько маленьких ошибок типо пропущенных c_str и т.д, но это мелочи
-iG- вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
работа со строками lg12 Помощь студентам 8 17.08.2009 10:07
Работа с строками Fellics{новичок} Общие вопросы Delphi 5 28.05.2009 18:03
Работа со строками ponchikpk Помощь студентам 13 17.03.2009 21:08
[С++]работа со строками Федор Помощь студентам 6 23.12.2007 12:35