我正在使用.find
函数来获取字符位置,以便对从文本文件读取的行进行一些字符串处理。我觉得我的实现是正确的,但是它给了我一个不可用的整数结果。
的
使用#include <string>
标头,
代码部分如下:
ifstream IoTFile;
IoTFile.open("temp_data.txt");
if (IoTFile.is_open())
{
while (!IoTFile.eof())
{
IoTFile >> sLine;
int pos = sLine.find(",");
cout << pos;
//some irrelevant string handling...
}
}
当我运行程序时,它没有给我任何错误,但是pos
的值类似于“ 1111111111111 ....”等,尽管位置12处有一个“,”逗号。这可能正在发生,以及如何解决?
答案 0 :(得分:2)
您的代码存在一些问题。让我一一解释:
(1)find
在查找char
时效率更高:您的代码搜索单个逗号字符,
,因此不需要将字符串作为参数传递给find()
调用。使用单引号','
代替双引号","
将使您的代码更高效:
sLine.find(',');
(2)find
不返回int
:std::string::find()
方法返回一个std::string::size_type
值。因此,调用find()
方法应该是这样的:
std::string::size_type pos = sLine.find(',');
或者您可以简单地使用auto
关键字,让编译器为您找到合适的类型
auto pos = sLine.find(',');
(3)检查find
的结果:调用find()
后,您必须检查它是否发现了任何东西。您可以通过将结果与std::string::npos
值进行比较来做到这一点。如果值相等,那么它什么也没找到。
std::string::size_type pos = sLine.find(',');
if (pos != std::string::npos) {
std::cout << pos;
}
(4)逐行读取文件:在我看来,您想逐行读取文件,但是您的代码所做的实际上是逐字读取。这就是为什么您的find()
呼叫无法正常工作的原因。如果要逐行读取文件,可以执行以下操作:
std::ifstream file("temp_data.txt");
if (file.is_open()) {
std::string line;
while (getline(file, line)) {
std::string::size_type pos = line.find(',');
// only print pos if the comma was found
if (pos != std::string::npos) {
std::cout << line << " - pos = " << pos << '\n';
}
}
file.close();
}