Страница 1 из 1

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

Добавлено: 20 дек 2017, 16:52
Mojiback
Всем доброго времени суток! Изрядно попотев, так и не смог решить задачу. Поэтому, ищу помощи здесь.
Из произвольного текста (взятом из файла), содержащего не более 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;
}
Рассчитываю на вашу внятную помощь, уважаемые обитатели форума.

Re: Решите задачку... С++

Добавлено: 20 дек 2017, 18:01
Absurd
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;
}
Вот код который разбивает строку на слова. Вам, наверное, нужно поменять разделитель с плюса на пробел. Потом пройтись по словам и удалить те, которые попадают под заданный критерий. Потом собрать строку обратно.

Re: Решите задачку... С++

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

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

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

P.S. Название темы изменил, хотя мог бы удалить тему вообще на основании правил форума. На будущее, именуй темы осмысленно.

Re: Решите задачку... С++

Добавлено: 20 дек 2017, 18:59
Mojiback
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? Да, по одной строчке, в цикл засунуть, потом немного подкинуть условий, и, может как-нибудь это дело поедет?

Re: Решите задачку... С++

Добавлено: 20 дек 2017, 19:35
Absurd
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.