Страница 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.