Отбросить слова при чтении из файла.

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Mojiback
Сообщения: 4
Зарегистрирован: 20 дек 2017, 16:42

20 дек 2017, 16:52

Всем доброго времени суток! Изрядно попотев, так и не смог решить задачу. Поэтому, ищу помощи здесь.
Из произвольного текста (взятом из файла), содержащего не более 10 строк, в каждой строке не более 80 символов вывести на экран исходный текст. В тексте удалить слова заданной длины (длину задает пользователь). Вывести полученный текст на экран. Результат также записать в выходной файл, имя файла задает пользователь.
Код по чтению текста из файла я сделал, а вот удалить слова заданной длины не получается:

Код: Выделить всё

#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;
int main()
{
	setlocale(0, "");
	ifstream file;
	file.open("Текст.txt");
	if (!file.is_open()) // если файл не найден
	{
		cout << "Ошибка! Файл не найден!" << endl;
		float n;
		cout << "Для продолжения нажмите любую клавишу...";
		cin >> n;
		exit(0);
	}
	static char  buff[1024][1024];
	while (!file.eof()) // цикл существует до конца файла
	{  
		int i = 0;
		file.getline(buff[i], sizeof(buff)); // записываем в buff, строчку i - файла
		cout << buff[i];
		cout << endl;
		++i;
	}
	file.close();
	system("pause > 1");
	return 0;
}
Рассчитываю на вашу внятную помощь, уважаемые обитатели форума.
Absurd
Сообщения: 1213
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

20 дек 2017, 18:01

Mojiback писал(а):Всем доброго времени суток! Изрядно попотев, так и не смог решить задачу. Поэтому, ищу помощи здесь.
Из произвольного текста (взятом из файла), содержащего не более 10 строк, в каждой строке не более 80 символов вывести на экран исходный текст. В тексте удалить слова заданной длины (длину задает пользователь). Вывести полученный текст на экран. Результат также записать в выходной файл, имя файла задает пользователь.
Код по чтению текста из файла я сделал, а вот удалить слова заданной длины не получается:
Рассчитываю на вашу внятную помощь, уважаемые обитатели форума.

Код: Выделить всё

#include <iostream>
#include <sstream>
#include <vector>

using namespace std;

vector<string> split(const string &s, char delim) {
    vector<string> result;
    stringstream ss(s);
    string item;
    while (getline(ss, item, delim)) {
        result.push_back(item);
    }
    return result;
}

int main() {
    string str = "adsf+qwer+poui+fdgh";
    vector<string> v = split(str, '+');
    for (auto i : v) {
        cout << i << endl;
    }
    return 0;
}
Вот код который разбивает строку на слова. Вам, наверное, нужно поменять разделитель с плюса на пробел. Потом пройтись по словам и удалить те, которые попадают под заданный критерий. Потом собрать строку обратно.
2B OR NOT(2B) = FF
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

20 дек 2017, 18:38

У тебя в массив сохранится только последняя строка, потому что ты пишешь постоянно в buff[0].

Строчку можно распарсить либо с помощью strtok, либо с помощью std::stringstream. Подробнее в MSDN.

Если не будет получаться, пиши.

P.S. Название темы изменил, хотя мог бы удалить тему вообще на основании правил форума. На будущее, именуй темы осмысленно.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Mojiback
Сообщения: 4
Зарегистрирован: 20 дек 2017, 16:42

20 дек 2017, 18:59

Absurd писал(а):

Код: Выделить всё

#include <iostream>
#include <sstream>
#include <vector>

using namespace std;

vector<string> split(const string &s, char delim) {
    vector<string> result;
    stringstream ss(s);
    string item;
    while (getline(ss, item, delim)) {
        result.push_back(item);
    }
    return result;
}

int main() {
    string str = "adsf+qwer+poui+fdgh";
    vector<string> v = split(str, '+');
    for (auto i : v) {
        cout << i << endl;
    }
    return 0;
}
Вот код который разбивает строку на слова. Вам, наверное, нужно поменять разделитель с плюса на пробел. Потом пройтись по словам и удалить те, которые попадают под заданный критерий. Потом собрать строку обратно.

Спасибо, конечно, за такую шикарную подсказку, а такой вариант нельзя как-либо развить?:

Код: Выделить всё

ofstream file2("cp.txt");
	string s;
	getline(file, s);
	file2 << s;
	system("pause > 1");
	return 0;
}
Адски криво, но суть проста - считать строку из файла с именем file через getline в строку s, а затем из s все данные перевести в файл с именем file2? Да, по одной строчке, в цикл засунуть, потом немного подкинуть условий, и, может как-нибудь это дело поедет?
Absurd
Сообщения: 1213
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

20 дек 2017, 19:35

Mojiback писал(а):Спасибо, конечно, за такую шикарную подсказку, а такой вариант нельзя как-либо развить?:

Код: Выделить всё

ofstream file2("cp.txt");
	string s;
	getline(file, s);
	file2 << s;
	system("pause > 1");
	return 0;
}
Адски криво, но суть проста - считать строку из файла с именем file через getline в строку s, а затем из s все данные перевести в файл с именем file2? Да, по одной строчке, в цикл засунуть, потом немного подкинуть условий, и, может как-нибудь это дело поедет?

Ну да, так и правильно. По одной строчке. Если еще не EOF, берешь строку s, передаешь ее моей функции split, получаешь массив (vector) из слов. Идешь циклом по этому вектору, отправляешь в выходной файл те строки которые не попадают под критерий отсечения. Отправляешь в выходной файл символ перевода строки (\n). Возвращаешься к шагу 1.
2B OR NOT(2B) = FF
Ответить