这是我用来检查文件中string's
存在的一些代码:
bool aviasm::in1(string s)
{
ifstream in("optab1.txt",ios::in);//opening the optab
//cout<<"entered in1 func"<<endl;
char c;
string x,y;
while((c=in.get())!=EOF)
{
in.putback(c);
in>>x;
in>>y;
if(x==s)
return true;
}
return false;
}
确保被搜索的字符串位于optab1.txt
的第一列,并且每行optab1.txt
总共有两列。
现在的问题是,无论传递什么字符串,因为参数s
总是返回false。你能告诉我为什么会这样吗?
答案 0 :(得分:5)
多么糟糕!为什么不使用标准的C ++字符串和文件读取函数:
bool find_in_file(const std::string & needle)
{
std::ifstream in("optab1.txt");
std::string line;
while (std::getline(in, line)) // remember this idiom!!
{
// if (line.substr(0, needle.length()) == needle) // not so efficient
if (line.length() >= needle.length() && std::equal(needle.begin(), needle.end(), line.begin())) // better
// if (std::search(line.begin(), line.end(), needle.begin(), needle.end()) != line.end()) // for arbitrary position
{
return true;
}
}
return false;
}
如果搜索字符串不需要位于行的开头,则可以使用更高级的字符串搜索功能替换substr
。 substr
版本的可读性最强,但它会复制子字符串。 equal
版本就地比较了两个字符串(但需要额外的大小检查)。 search
版本可以在任何地方找到子字符串,而不仅仅是在行的开头(但需要付出代价)。
答案 1 :(得分:1)
目前还不太清楚你要做的是什么,但是在这个问题上
如果普通while
未签名,则永远不会遇到char
。 (通常
不是,所以你可能会逃避它。)另外,你没有提取
循环中的行尾,所以你可能会看到它而不是EOF
,并且
在循环中经常传递一次。我会更多地写这个
的:
bool
in1( std::string const& target )
{
std::ifstream in( "optab1.txt" );
if ( ! in.is_open() )
// Some sort of error handling, maybe an exception.
std::string line;
while ( std::getline( in, line )
&& ( line.size() < target.size()
|| ! std::equal( target.begin(), target.end(), line.begin() ) ) )
;
return in;
}
请注意检查打开成功。你有一个可能的原因 总是返回false是因为你没有成功打开文件。 (但除非你在开放后检查状态,否则我们无法知道。)