main文件
#include<string>
#include<vector>
#include<fstream>
#include<iostream>
#include"query.h"
using namespace std;
int main()
{
string words;
ifstream in("D:\liuqiqi.txt");
Textquery liuqiqi(in);
while (1)
{
cout << "Please enter the words you want to find:" << endl;
if (!(cin >> words) || words == "q") break;
print(cout, liuqiqi.query(words));
}
}
头文件
#include<string>
#include<map>
#include<set>
#include<vector>
#include<iostream>
#include<sstream>
#include<fstream>
#include<memory>
using namespace std;
class Queryresult;
class Textquery
{
public:
Textquery(ifstream&);//读取文件的构造函数
Queryresult query(const string & s) const;//返回查询结果
private:
shared_ptr<vector<string>> file;
map<string, shared_ptr<set<vector<string>::size_type>>> wm;
};
class Queryresult
{
friend ostream& print(ostream& os, const Queryresult & qu);
public:
Queryresult(string s, shared_ptr<vector<string>> fi, shared_ptr<set<vector<string>::size_type>> li) :sought(s), file(fi), lines(li){}//构造函数
private:
string sought;
shared_ptr<vector<string>> file;
shared_ptr<set<vector<string>::size_type>> lines;
};
/*Textquery的构造函数*/
Textquery::Textquery(ifstream & in)
{
string line;
while (getline(in, line))
{
file->push_back(line);
int n = file->size() - 1;
string word;
istringstream is(line);
while (is >> word)
{
auto &lines = wm[word];//如果word在map中则返回word对应的行号set,若不在则初始化,返回指针为空
if (!lines)
{
lines.reset(new set<vector<string>::size_type>);
}
lines->insert(n);
}
}
}
/*Textquery返回查询结果的函数*/
Queryresult Textquery::query(const string& s) const
{
static shared_ptr<set<vector<string>::size_type>> nodate(new set<vector<string>::size_type>);//如果找不到,返回一个空的set行号列表
auto fd = wm.find(s);
if (fd != wm.end())
{
return Queryresult(s, file, fd->second);
}
else return Queryresult(s, file, nodate);
}
/*输出函数*/
ostream& print(ostream& os, const Queryresult & qu)
{
if (qu.lines->size())
{
os << "Did not find the word:" << qu.sought << endl;
return os;
}
else
{
os << qu.sought << " occurs " << endl;
for (auto e : *(qu.lines))
{
os << "(line " << e + 1 << ") " << *(qu.file->begin() + e) << endl;
}
return os;
}
}
3 个解决方案
#1
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,
看不懂时双击下一行,直到能看懂为止。
#2
0x00000008 这种接近零值的地址,一般是由于你操作NULL指针造成的,自己单步一下看出错在哪句,然后检查下指针
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
#3
这种问题一般都是访问的位置的值为不正常的值
#1
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,
看不懂时双击下一行,直到能看懂为止。
#2
0x00000008 这种接近零值的地址,一般是由于你操作NULL指针造成的,自己单步一下看出错在哪句,然后检查下指针
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
#3
这种问题一般都是访问的位置的值为不正常的值