Вывести на экран строки длиной больше 10 и меньше 50 символов из контейнера multiset
Есть код программы, только в нём используется контейнер multimap, и строки с длиной больше 11 и меньше 20. В файл должны быть записаны только строки длиной больше 10 и меньше 50 символов. Использовать контейнер multiset<std::string, Compare>. Входной файл существует на диске, выходной файл создается программой.
Задача данной программы - вывод строк где больше 10 символов и меньше 20. Сейчас программа работает с контейнером multimap. Нужно чтобы программа работала с контейнером multiset и выводила строки где больше 10 символов и меньше 50, и чтобы эти строки были упорядочены по длине.
#include <stdio.h>
#include <iostream>
#include <map>
#include <exception>
#include <stdexcept>
int main() {
try {
FILE* filein;
FILE* fileout;
/*char name[256];
std::cout << "Enter the opening file's path:" << std::endl;
std::cin >> name;*/
/*char nameout[256];
std::cout << "Enter the saving file's path:" << std::endl;
std::cin >> nameout;*/
char name[] = "test1.txt";
char nameout[] = "resout.txt";
if ((filein = fopen(name, "r")) == NULL)
throw std::runtime_error("Can't open the file.");
if ((fileout = fopen(nameout, "w")) == NULL) {
fclose(filein);
throw std::runtime_error("Can't create the file.");
}
std::multimap<int, int, std::greater <int>> myMap; //создание контейнера
char str[1024];
int len;
int pos;
std::string s;
bool counter = 0;
while (!feof(filein)) {
if (fgets(str, 1024, filein)) {
std::cout << str;
s = str;
len = s.length();
pos = ftell(filein);
if (len >= 11 && len <= 21)
counter++;
myMap.insert(std::make_pair(len, pos - 1)); //заполнение контейнера
}
}
if (counter == 0) {
std::cout << '\n';
fclose(filein);
fclose(fileout);
throw std::runtime_error("Required strings are missing.");
}
std::cout << std::endl;
std::multimap<int, int>::iterator it; //объявление итератора
std::cout << "result:" << std::endl;
std::multimap<int, int>::iterator itlow, itup; //границы контейнера
itlow = myMap.lower_bound(21);
itup = myMap.upper_bound(11);
for (it = itlow; it != itup; ++it)
{
if ((it == myMap.end()) && (it->first >= 11) && (it->first <= 21)) //без доп условия последняя строка не выводится корректно
{
fseek(filein, it->second - it->first + 1, SEEK_SET);
fgets(str, it->first + 1, filein);
}
else
{
fseek(filein, it->second - it->first, SEEK_SET);
fgets(str, it->first, filein);
}
fputs(str, fileout);
fputs("\n", fileout);
//std::cout << it->first << "=" << it->second << std::endl;
std::cout << str << std::endl;
}
fclose(filein);
fclose(fileout);
}
catch (std::exception& exception)
{
std::cerr << "Standard exception: " << exception.what() << std::endl;
}
}