【问题标题】:why using a ifstream object twice causes error?为什么使用 ifstream 对象两次会导致错误?
【发布时间】:2015-08-19 04:15:46
【问题描述】:

我想输出一个词在文本中出现的次数,并输出包含该词的行,但是当我输出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();
}

【问题讨论】:

  • 是否有某些原因您不只是将std::vector&lt;std::string&gt; 作为添加的参考参数发送到setMap 并填充它而不是丢弃一些东西?就此而言,它是否真的首先需要?
  • 你检查过 ifs.open 的返回值吗?

标签: c++ vector ifstream


【解决方案1】:

当你第一次调用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
}

【讨论】:

  • 感谢您的帮助并认为它是正确的,但是当我添加它时它仍然无法正常工作。您能提供任何进一步的帮助吗?非常感谢!
  • 不工作是什么意思?给出错误?附带说明一下,为什么要多次读取文件,为什么不读取一次,然后将向量传递给其他方法?
  • 我现在想说的是真的真的非常感谢!我有这个想法,但你知道,我只是放弃了它。非常感谢! (请原谅我糟糕的英语)
猜你喜欢
  • 2013-06-19
  • 1970-01-01
  • 1970-01-01
  • 2012-05-07
  • 1970-01-01
  • 2019-12-13
  • 1970-01-01
  • 2012-05-04
  • 2020-07-16
相关资源
最近更新 更多