Я хочу вывести время, когда слова встречаются в тексте и выводит строки, содержащие слово, но когда я выхожу vector[*beg]
, я обнаружил, что вектор пуст!Почему использование объекта ifstream вызывает ошибку?
Я думаю, что проблема лежит в использовании ifstream &ifs
дважды:
auto wordMap=setMap(ifs);
std::vector<std::string> vvector = read_to_vector(ifs);
Если я поменяв два заявления, он сломался сразу
Я хочу знать, где проблема и как ее решить.
#include <iostream>
#include<vector>
#include <fstream>
#include <string>
#include <set>
#include <map>
#include <sstream>
#include <memory>
std::vector<std::string> read_to_vector(std::ifstream &ifs)
{
std::string lines;
std::vector<std::string> sentences;
while (std::getline(ifs, lines))
{
sentences.push_back(lines);
}
return sentences;
}
std::map<std::string,std::set<size_t>> setMap(std::ifstream &ifs)
{
std::vector<std::string> word_vector = read_to_vector(ifs);
std::string lines, words;
std::map < std::string, std::set<size_t> > word_map;
for (size_t i = 0; i < word_vector.size(); i++)
{
//i is the current line_num
std::istringstream stream(word_vector[i]);
while (stream >> words)
{
word_map[words].insert(i);
}
}
return word_map;
}
void print(std::ifstream &ifs)
{
auto wordMap=setMap(ifs);
std::vector<std::string> vvector = read_to_vector(ifs);
std::string search;
std::cout << "please input the word that you wanna search" << "\n";
std::cin >> search;
auto findw = wordMap.find(search);
if (findw != wordMap.cend())
std::cout << search << " occurs " << findw->second.size()
<< " times : " << std::endl;
std::set<size_t> lineNum = findw->second;
//it is a set
auto beg = lineNum.begin();
while (beg != lineNum.end())
{
std::cout << *beg;
//std::cout<<vvector[*beg];
beg++;
}
for (auto c : vvector)
std::cout << c << std::endl;
if (vvector.empty())
std::cout << "vector is empty!";
//WTF!!! vector is empty!!!
}
int main()
{
std::ifstream ifs;
ifs.open("text.txt",std::ios::in);
print(ifs);
ifs.close();
}
Есть по какой-то причине вы не просто отправляете 'std :: vector' в 'setM ap 'как добавленный ссылочный аргумент и заполнить его, а не что-то, что нужно выбросить? В этом отношении, действительно ли это действительно необходимо? –
WhozCraig
Вы проверили возвращаемое значение из ifs.open? –