C++ C++;关于strcmp和读取文件
我在main.cpp得到了一个密码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")
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
表示相等,因此 如果(strcmp(line,“…”==0)不符合您的意图,则应写入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
表示相等,因此 如果(strcmp(line,“…”==0)不符合您的意图,则应写入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已经得到了这个建议。我想他很快就会自己解决的。