如何在C ++中按char读取文件char?

时间:2019-05-13 08:10:56

标签: c++

我必须逐字阅读文本,并将每个单词保存在数组中,但是我必须排除逗号,句号等。

我猜最好的选择是按char读取文件char,以便在读取阶段可以排除每个非字母char。 从逻辑上来说,我并不是很了解文件系统的输入,我的代码无法正常工作

Create

3 个答案:

答案 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设置为字符串,它将读取文件中字符串大小的部分。您还可以获取整行,然后根据逗号,空格等对其进行分割... 希望对您有帮助