1

我需要在读取文本文件的搜索二叉树中插入数据。当我在数据之间使用空格时它可以工作,但如果我像我想要的那样使用逗号它就不起作用。例如,我希望我的文本文件如下所示:

New-York,c3,Luke
London,c5,Nathan
Toronto,c1,Jacob
  ...

我的文本文件现在看起来像这样:

New-York c3 Luke
London c5 Nathan
Toronto c1 Jacob
  ...

我还希望我的程序不要认为空格意味着它需要查看下一个数据,只能使用逗号。

这就是我的代码的样子:

void fillTree( BinarySearchTree *b)
{
    ifstream file;
    file.open("data.txt");
    string city;
    string tag;
    string name;
    Person p;

    if(!file) {
        cout<<"Error. " << endl;
    }

    while(file >> city >> tag >> name)
    {
        p.setCity(city);
        p.setTag(tag);
        p.setName(name);
        cout << p.getCity() << " " << p.getTag() << " " << p.getName() << endl;
        (*b).insert(p);
    }
    file.close();
}

我需要在代码中进行哪些更改,以便可以使用逗号而不是空格?我觉得它在带有逗号而不是空格的文本文件中看起来更整洁。我很确定我需要在这段代码中编辑一些东西,但如果它可能在其他地方,请告诉我。

4

2 回答 2

1

用于getline ( file, value, ',' );读取字符串,直到发生昏迷。

string value;
while(file.good())
{
    getline ( file, value, ',' );
    p.setCity(value);
    getline ( file, value, ',' );
    p.setTag(value);
    getline ( file, value, ',' );
    p.setName(value);
    cout << p.getCity() << " " << p.getTag() << " " << p.getName() << endl;
    (*b).insert(p);
}
于 2012-11-18T19:19:32.920 回答
0

在 C++ 中,您可以重新定义流将什么视为空间。例如,您可以将其更改为表示',''\n'。要做的技术是使用带有修改的刻面imbue()的流。方面的基础设施看起来有点复杂,但是一旦到位,读取数据就可以方便地使用输入运算符:std::localestd::ctype<char>

#include <locale>

template <char S0, char S1>
struct commactype_base {
    commactype_base(): table_() {
        std::transform(std::ctype<char>::classic_table(),
                       std::ctype<char>::classic_table() + std::ctype<char>::table_size,
                       this->table_, 
                       [](std::ctype_base::mask m) -> std::ctype_base::mask {
                           return m & ~(std::ctype_base::space);
                       });
        this->table_[static_cast<unsigned char>(S0)] |= std::ctype_base::space;
        this->table_[static_cast<unsigned char>(S1)] |= std::ctype_base::space;
    }
    std::ctype<char>::mask table_[std::ctype<char>::table_size];
    static std::ctype_base::mask clear_space(std::ctype_base::mask m) {
        return m & ~(std::ctype_base::space);
    }
};
template <char S0, char S1 = S0>
struct ctype:
    commactype_base<S0, S1>,
    std::ctype<char>
{
    ctype(): std::ctype<char>(this->table_, false) {}
};

int main() {
    std::ifstream in("somefile.txt");
    in.imbue(std::locale(std::locale(), new ::ctype<',', '\n'>));
    std::string v0, v1, v2;
    while (in >> v0 >> v1 >> v2) {
        std::cout << "v0='" << v0 << "' v1='" << v1 << "' v2='" << v2 << "'\n";
    }
}
于 2012-11-18T19:40:18.303 回答