我试图逐个字符地读取文本文件。我正在使用字符串来读取文件。我的阅读文件的代码如下:
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
答案 0 :(得分:3)
std::string data_str;
定义std::string
。
std::string tokenizer = data_str[i]
定义std::string
并尝试使用单个字符构造string
。 std::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
长度的重复。