0

我在 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, [3, 8]
Dot3D, [7, 12, 3], [-9, 13, 68]
Map3D, [1, 3, 8]
Dot2D, [5, 7], [3, 8]
Map2D, [6, 2]

但问题是当我尝试编译和运行时,它会保留打印 map2D 并且 Map3d 甚至不会被 cout

我在 strcmp 上的逻辑有问题吗

更新:

我改为 if(strstr(line,"Map2D") 及其工作。

感谢所有帮助。

4

2 回答 2

4

getline不是在阅读行,而是在遇到下一个“,”。

即,您迭代:

Map2D
 [3
 8]\nDot3D
 [7
 12
 3]
 [-9
 13
 68]\nMap3D
...

应该很容易看出为什么您从来没有碰到等于“Map3D”的标记。

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

于 2012-11-14T10:24:46.900 回答
0

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

  • cin.ignore()将要求用户输入一个额外的空行。

  • while ( fin.good() )肯定是错的;事实上,从来没有fin.good()合适的情况。你可能想要 while ( fin.getline( line, 20, ',' ) )这里。

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

  • 您每次通过循环只能读取到下一个逗号,因此您的输入类似于"Map2D", " [3", " 8]\nDot3D", " [7"...

  • strcmp返回 a int,而不是 a bool,以表示相等,因此除非您的意图是明确的混淆,否则您0应该写作。 (类似地,当输入变量只包含一个逗号分隔的字段时if ( strcmp( line, "..." ) == 0 )命名输入变量也是一种混淆。)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" ) {
        //  ...
    } // ...
}
于 2012-11-14T10:40:21.080 回答