地图错误值

时间:2017-04-25 18:46:20

标签: c++ stl

在名为CodinGameMIME Type拼图中,我们要求制作一个程序:

  • 获取扩展数据库及其相应的MIME类型。
  • 读取多个文件名。
  • 为每个文件打印相应的MIME类型。如果文件的扩展名不存在于数据库中,则应该打印UNKNOWN。
  • 以不区分大小写的方式检测扩展名。例如,如果我们知道MIME类型image / png,无论扩展名如何出现在文件名中(" pic.png"或" pic.PNG"或" pic.PnG"),该程序应该能够告诉它的MIME类型是image / png

我能够解决这个难题。我在这里的第一次尝试更复杂。然而,我在这个问题中发布了它,因为我有一个奇怪的错误,我无法弄清楚背后的原因是什么。

考虑包含扩展及其相应MIME类型的以下文件(" MIME.dat"):

html
text/html
png
image/png
gif
image/gif

同时考虑包含文件名称的以下文件(" names.dat):

animated.gIf
portrait.png
index.html

预期输出(遵循名称在文件中出现的顺序):

image/gif
image/png
text/html

这是我的代码:

#include <iostream>
#include <string>
#include <map>
#include <fstream>
#include <cstdlib>

using namespace std;

struct cmp_ins {
    bool operator()(const string& s1, const string& s2) const
    {
        if(s1.length()!=s2.length())
            return false;
        else
        {
            bool b=true;
            string::const_iterator i,j;
            for(i=s1.begin(), j=s2.begin(); b && i!=s1.end();++i,++j)
            {
                if((isalpha(*i) && isalpha(*j)) && (toupper(*i)!=toupper(*j)))
                    b=false;
                else if((isalpha(*i) && !isalpha(*j)) || (!isalpha(*i) && isalpha(*j)))
                    b=false;
                else if((!isalpha(*i) && !isalpha(*j)) && *i!=*j)
                    b=false;
            }
            return b;
        }
    }
};

int main()
{
    try
    {
        map<string,string,cmp_ins> db;
        string name,MT;
        string::iterator j;
        ifstream fdb("MIME.dat"), fn("names.dat");
        if(!fdb.is_open())
            throw runtime_error("Couldn't open MIME.dat");
        if(!fn.is_open())
            throw runtime_error("Couldn't open names.dat");
        struct cmp_ins obj;//Will be used to verify if cmp_ins works correctly
        while(fdb >> name >> MT)
        {
            db[name]=MT;
            cout << "(" << name << "," << MT << ")" << endl;
        }
        cout << endl;
        fdb.close();
        while(fn >> name)
        {
            cout << "name:" << name << endl;
            for(j=name.end();*j!='.' && j!=name.begin();--j);
            if(*j!='.')
                cout << "UNKNOWN" << endl;
            else
            {
                string ac=name.substr(j-name.begin()+1,name.end()-j);
                cout << ac << "=gif? " << obj(ac,string("gif")) << endl;
                map<string,string,cmp_ins>::iterator t=db.find(ac);
                cout << "MIME: ";
                if(t==db.end())
                    cout << "UNKNOWN" << endl;
                else
                    cout << t->second << endl;
            }
            cout << endl;
        }
        fn.close();
        return EXIT_SUCCESS;
    }
    catch(exception& e)
    {
        cerr << e.what() << endl;
        return EXIT_FAILURE;
    }
}

这是输出:

(html,text/html)
(png,image/png)
(gif,image/gif)

name:animated.gIf
gIf=gif? 1
MIME: image/gif

name:portrait.png
png=gif? 0
MIME: image/gif

name:index.html
html=gif? 0
MIME: UNKNOWN

如您所见,该计划考虑&#34; portrait.png&#34;作为一个image / gif文件,当png!= gif时,函数cmp_ins能够分辨出它(它返回0)。此外,该程序无法识别&#34; index.html&#34;的类型。

你能告诉我出了什么问题吗?

1 个答案:

答案 0 :(得分:2)

要使比较器与std::map一起使用,它必须满足Compare概念:

  

当上下文转换为bool时,应用于Compare类型的对象的函数调用操作的返回值,如果调用的第一个参数出现在此Compare类型引发的严格弱排序关系中的第二个参数之前,则返回true,否则就是假的。

如果对象相等,你的比较器似乎返回true,这不是这个概念所要求的。您需要重写它以满足严格的弱排序关系&#34;