2015-08-19 7 views
4

Я хочу вывести время, когда слова встречаются в тексте и выводит строки, содержащие слово, но когда я выхожу 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(); 
} 
+0

Есть по какой-то причине вы не просто отправляете 'std :: vector ' в 'setM ap 'как добавленный ссылочный аргумент и заполнить его, а не что-то, что нужно выбросить? В этом отношении, действительно ли это действительно необходимо? – WhozCraig

+0

Вы проверили возвращаемое значение из ifs.open? –

ответ

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 
} 
+0

Я ценю, что вы помогаете и думаете, что это правильно, но я все еще не работаю, когда добавляю это. Можете ли вы оказать дальнейшую помощь? Thx много! – shidongxing

+0

Что вы имеете в виду, если не работаете? Дает ошибку? На стороне примечания, почему вы читаете файл несколько раз, почему бы не прочитать его один раз, а затем передать вектор другим методам? –

+0

Что я хочу сказать сейчас ДЕЙСТВИТЕЛЬНО ДЕЙСТВИТЕЛЬНО спасибо! У меня была эта мысль, но вы знаете, я просто сдался. Большое спасибо! (и простить моего бедного английского) – shidongxing