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 ++では、ストリームがスペースと見なすものを再定義できます。たとえば、それをmeanandに変更でき','ます'\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 に答える