我必须逐字阅读文本,并将每个单词保存在数组中,但是我必须排除逗号,句号等。
我猜最好的选择是按char读取文件char,以便在读取阶段可以排除每个非字母char。 从逻辑上来说,我并不是很了解文件系统的输入,我的代码无法正常工作
Create
答案 0 :(得分:1)
我猜file.open()失败-您不能正确处理这种情况。 解决这种情况的一种方法是:
file.open ("text.txt");
if (!file) {
std::cout << "error reading text.txt" << std::endl;
}
除此之外,您最好通过以下方式一次读取一行文件: std::getline
答案 1 :(得分:1)
尽管您使用get()
的方式很糟糕(您需要将char作为参数传递),但您应该直接逐字阅读而不是逐字逐字阅读。
operator>>()
中的std::ifstream
已超载,无法逐字阅读。
您可以在下面找到一个示例,该示例通过逐字阅读来完成您想要的操作:
示例(逐词)
#include <fstream>
#include <iostream>
#include <vector>
std::vector<std::string> split(const std::string & s, char c);
int main()
{
std::string file_path("text.txt");
std::ifstream in_s(file_path);
std::vector <std::string> content;
if(in_s)
{
std::string word;
while(in_s >> word)
{
// handle fullstops
while(word.find('.') != std::string::npos)
{
word.replace(word.find("."), 1, " ");
}
// handle commas
while(word.find(',') != std::string::npos)
{
word.replace(word.find(","), 1, " ");
}
for(std::string w : split(word, ' '))
content.push_back(w);
}
in_s.close();
}
else
std::cout << "Could not open: " + file_path << std::endl;
for(std::string word : content)
std::cout << word << std::endl;
return 0;
}
std::vector<std::string> split(const std::string & s, char c)
{
std::vector<std::string> splitted;
std::string word;
for(char ch : s)
{
if((ch == c) && (!word.empty()))
{
splitted.push_back(word);
word.clear();
}
else
word += ch;
}
if(!word.empty())
splitted.push_back(word);
return splitted;
}
通过逐行阅读进行升级
当然,使用该代码,我们可以很容易地看到逐行阅读会更有效。
要做到这一点,您只需替换:
while(in_s >> word)
通过:
while(getline(in_s, word)) // Of course you can change the variable name 'word' by 'line' for a better consistency and readability.
如果您确实想逐个字符地读取字符,则可以使用eof()
中的方法ifstream
检查文件的结尾。
希望它可以提供帮助。
答案 2 :(得分:0)
如果将x设置为字符串,它将读取文件中字符串大小的部分。您还可以获取整行,然后根据逗号,空格等对其进行分割... 希望对您有帮助