为什么两次使用ifstream对象会导致错误
why using a ifstream object twice causes error?
我想输出一个单词在文本中出现的次数,并输出包含该单词的行,但是当我输出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();
}
当您第一次调用read_to_vector
时(在setMap
中),它到达文件的末尾,因此下次调用它时(在print
中),vector将为空。在读取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
}
相关文章:
- 在函数中声明的 ifStream 对象在发布模式下不起作用
- fstream / ifstream / ofstream 对象如何转换为布尔值
- 如何确保我的"ifstream"文件对象指向的文件内容已更新?
- 自定义类对象的C++向量 - 复制构造函数已删除 - std::ifstream
- C++ : 如何在使用 getline() 和 ifstream 对象从文件中读取一行时跳过第一个空格?
- 如何在多个函数中操作 ifstream 对象
- 如何从文件*中获取和std :: ifstream对象
- 为什么我在 gdb 中收到 ifstream 对象的<不完整类型>消息?
- 故障位被设置为ifstream对象,原因是什么
- 通过 ifstream 对象读取C++中的文件
- C 在具有不同对象类型的容器中管理ifstream
- 对ifstream对象调用close时出现分段错误
- 如何创建一个ifstream对象的数组,以及如何使用编号的文本文件填充该数组
- 将 ifstream 对象传递给需要 istream 类型的函数
- 将文件的常量字符* 地址传递给 ifstream 对象的问题
- 在到达文件末尾后回放ifstream对象
- C++在同一对象的成员之间传递 ifstream 变量
- 分段错误,因为 ifstream 对象作为参考发送
- 在使用 ofstream 将数据写入其文件后更新 ifstream 对象
- 如何将 ifstream 对象传递给函数后从输入文件中读取