我想输出单词出现在文本中的时间并输出包含单词的行,但是当我输出vector[*beg]
时,我发现向量是空的!
我认为问题在于使用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();
}
答案 0 :(得分:6)
当您第一次拨打read_to_vector
时(在setMap
中)它会到达文件末尾,所以当您下次调用它时(在print
中),向量将为空。在读取read_to_vector
中的行之前重置光标。将其更改为:
std::vector<std::string> read_to_vector(std::ifstream &ifs)
{
ifs.seekg (0, ifs.beg);//add this
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::vector<std::string> word_vector )
{
//std::vector<std::string> word_vector = read_to_vector(ifs);
std::string lines, words;
std::map < std::string, std::set<size_t> > word_map;
//some code
}
然后
void print(std::ifstream &ifs)
{
std::vector<std::string> vvector = read_to_vector(ifs);
auto wordMap=setMap(vvector);
// some code
}