不能将std :: string设置为等于另一个std :: string

时间:2016-08-06 00:42:06

标签: c++ string for-loop std ifstream

我试图逐个字符地读取文本文件。我正在使用字符串来读取文件。我的阅读文件的代码如下:

int main()
{   
    std::ifstream data;
    data.open("C:\\Users\\Christian Dean\\Documents\\CodeLiteWorkspace\\CplusplusPractice\\src\\test_file.qz");
    std::string data_str;
    int counter = 0;
    data >> data_str;
    for(int i = 0; i < data_str.length(); i++)
    {
        std::string tokenizer = data_str[i];
        if (tokenizer == "output")
        {
            counter++;
        }
    }
    std::cout << counter << std::endl;
    data.close();
    return 0;
}

正如您所看到的,在我的for循环中,我将字符串tokenizer设置为等于字符串data_str的第0个索引。但是在编译时会显示错误

  

`main.cpp:27:37:错误:从'char'无效转换为''const char *'[-fpermissive]。

我真的不知道我怎么能逐个字符地读取文件。我尝试将tokenizer设置为char类型。但是当我运行该程序时,它表示counter变量等于0。显然,使tokenizer变量成为char类型无效。

如果需要,文本文件的内容如下:

 output: "Hello World

2 个答案:

答案 0 :(得分:3)

std::string data_str;

定义std::string

std::string tokenizer = data_str[i]

定义std::string并尝试使用单个字符构造stringstd::string没有接受单个字符的构造函数。

看到你要将这个单个字符串与整个单词进行比较,这不是你想要做的。

data >> data_str;

读入以空格分隔的标记 - 实际上是一个单词加上任何标点符号。

所以

while (data >> data_str)
{
    stripPunctuation(data_str);
    if (data_str == "output")
    {
        counter++;
    }
}

stripPunctuation看起来像void stripPunctuation(std::string & input)并会删除所有标点符号,但我只是将该黑客作为简化示例包含在内。这种方法可行,但更好的解决方案就像changing the delimiter for cin (c++)一样,可以添加要剥离的所有标点符号,让>>为您完成工作。

然后你得到

// configure stream to treat punctuation as whitespace here
while (data >> data_str)
{
    if (data_str == "output")
    {
        counter++;
    }
}

你已经完成了。

答案 1 :(得分:1)

尝试

std::string tokenizer = std::string(1, data_str[i]);

std::string没有一个只占用char的构造函数。但是,我们使用的构造函数重载在第二个参数中使用char,并创建一个std::string,其中包含第一个参数给出的char长度的重复。