C++ C++;关于strcmp和读取文件

C++ C++;关于strcmp和读取文件,c++,C++,我在main.cpp得到了一个密码 cout<<endl<<"Please enter filename: "; cin.ignore(); getline(cin,fileName); fin.open(fileName.c_str()); if(fin.is_open()) { while(fin.good()) { fin.getline(line,20,','); if(!strcmp(line,"Map2D")

我在main.cpp得到了一个密码

cout<<endl<<"Please enter filename: ";
cin.ignore();
getline(cin,fileName);
fin.open(fileName.c_str());
if(fin.is_open())
{

    while(fin.good())
    {
        fin.getline(line,20,',');

        if(!strcmp(line,"Map2D")) 
        {
            cout << "Map 2D" << endl;
        }
        else if(!strcmp(line,"Map3D")) 
        {
            cout << "Map 3D" << endl;
        }
        else if(!strcmp(line,"Dot2D")) 
        {
            cout << "Dot 2D" << endl;
        }
        else if(!strcmp(line,"Dot3D")) 
        {
            cout << "Dot 3D" << endl;
        }

    }
}
但问题是,当我尝试编译和运行时,它会一直打印map2D,而Map3d甚至无法打印

我的strcmp逻辑有问题吗

更新:

我改为if(strstr(行,“Map2D”)及其工作


谢谢您的帮助。

您的
getline
没有读取行,而是在遇到下一个“,”之前

即,您迭代:

Map2D
 [3
 8]\nDot3D
 [7
 12
 3]
 [-9
 13
 68]\nMap3D
...
应该很容易理解为什么你从来没有碰到一个等于“Map3D”的标记


<>顺便说一下,粘贴的代码不是编译的代码。C++中没有“ELISIF”这样的东西。

< p>您的代码> GETLION/CODE>不是读取行,但直到遇到下一个“”,

即,您迭代:

Map2D
 [3
 8]\nDot3D
 [7
 12
 3]
 [-9
 13
 68]\nMap3D
...
应该很容易理解为什么你从来没有碰到一个等于“Map3D”的标记


顺便说一下,粘贴的代码不是编译的代码。C++中没有“ELISIF”这样的东西。

< P>代码中存在许多问题,其中一些问题是明显的。 与你的问题无关,但我会按顺序处理:

  • cin.ignore(),
    空行

  • while(fin.good())肯定是错误的;事实上,从来没有错误 如果
    fin.good()
    合适,您可能需要
    while(fin.getline(line,20',,)
    这里

  • 在使用之前,您不会验证
    fin.getline
    是否成功 结果

  • 每次通过循环时,最多只能读取下一个逗号,因此 输入类似于
    “Map2D”
    “[3”
    “8]\nDot3D”
    ”[7”

  • strcmp
    返回一个
    int
    ,而不是
    bool
    ,用
    0
    表示相等,因此 如果(strcmp(line,“…”==0)不符合您的意图,则应写入
    if
    是显式模糊处理。(类似地,命名输入变量
    line
    当它只包含一个逗号分隔的字段时,也是 混淆。)

这样做的正确方法可能是使用
std::string
读取完整的行,然后分析行本身 使用任意数量的标准工具。例如:

std::string line;
while ( std::getline( fin, line ) ) {
    std::string label
        = std::string( line.begin(),
                       std::find( line.begin(), line.end(), ',' ) );
    if ( label == "Map2D" ) {
        //  ...
    } else if ( label == "Map3D" ) {
        //  ...
    } // ...
}

您的代码存在许多问题,其中一些问题显然是错误的 与你的问题无关,但我会按顺序处理:

  • cin.ignore(),
    空行

  • while(fin.good())肯定是错误的;事实上,从来没有错误 如果
    fin.good()
    合适,您可能需要
    while(fin.getline(line,20',,)
    这里

  • 在使用之前,您不会验证
    fin.getline
    是否成功 结果

  • 每次通过循环时,最多只能读取下一个逗号,因此 输入类似于
    “Map2D”
    “[3”
    “8]\nDot3D”
    ”[7”

  • strcmp
    返回一个
    int
    ,而不是
    bool
    ,用
    0
    表示相等,因此 如果(strcmp(line,“…”==0)不符合您的意图,则应写入
    if
    是显式模糊处理。(类似地,命名输入变量
    line
    当它只包含一个逗号分隔的字段时,也是 混淆。)

这样做的正确方法可能是使用
std::string
读取完整的行,然后分析行本身 使用任意数量的标准工具。例如:

std::string line;
while ( std::getline( fin, line ) ) {
    std::string label
        = std::string( line.begin(),
                       std::find( line.begin(), line.end(), ',' ) );
    if ( label == "Map2D" ) {
        //  ...
    } else if ( label == "Map3D" ) {
        //  ...
    } // ...
}

首先,代码中的代码不能编译,C++中没有<代码> ELSIF,<代码>。也不要循环在代码>鳍。在条件中。第三,
行的声明是什么?最后,如果您尝试使用调试器单步执行代码,它将帮助您查看所有变量的内容。对不起,应该是打字错误,否则最好复制粘贴足够的代码以进行编译和尝试。显然,fin.getline在不使用该行的情况下失败。首先,代码中的代码不能编译,C++中没有<代码> ELSIF,<代码>。也不要循环在代码>鳍。
在条件中。第三,
行的声明是什么?最后,如果您尝试使用调试器单步执行代码,它将帮助您查看所有变量的内容。对不起,应该是打字错误,否则最好复制粘贴足够的代码以进行编译和尝试。显然,fin.getline在不使用该行的情况下失败。我改为strstr,问题已经解决。谢谢您的帮助。@user1777711:最好是阅读整行内容,然后分析每个标记(例如,使用
istringstream
)。像这样吞下换行符中间的标记不是很好的风格。@DevSolar user1777711已经得到了这个建议。我想他很快就会自己解决的。我改成了strstr,问题已经解决了。谢谢你的帮助。@user1777711:最好是阅读整行,然后解析每个标记(例如,通过使用
istringstream
)。像这样吞下换行符并不是很好的方式。@DevSolar用户1777711已经得到了这个建议。我想他很快就会自己解决的。