1

私の入力ファイルは次のようなものです:

C:\Users\DeadCoder\AppData\Local\CoCreate

ツリーを作成していますが、入力ファイルから\区切り記号で読み取るときに、ディレクトリの名前を抽象化する必要があります。上記の例のように、c:、users、DeadCoder、Appdata ... を個別に抽象化する必要があります。すべての人が質問を理解していることを願っています。次に、取得したオプションを見てみましょう。

1- istringstreamでは完全に正常に機能しますwhitespaceが、では機能しません\

2- strtok()チャーで動作します。したがって、文字列を char に変更する必要がありますが、これは本当にしたくありません。

3- Boost Tokenizer()これは興味深いようで、少し前にグーグルで検索したことを除いて、過去に精通していません。コードをコピーしたところ、次のようになりました。

#include <boost/foreach.hpp>
#include <boost/tokenizer.hpp>
using namespace boost;

int main(){

    string tempStr;
    ifstream fin;
    fin.open("input.txt");
    int i=0;

    while (!fin.eof()){
        getline(fin,tempStr);
        char_separator<char> sep("\"); // error: missing terminating " character
        tokenizer<char_separator<char>> tokens(tempStr, sep);
        for (const auto& t : tokens) {
            cout << t << "." << endl;
        }
}

"error: boost/foreach.hpp: No such file or directory" これにより、誰かがここで私を助けることができるというエラーが発生し ます。better wayそして、で入力ファイルを読み取る他に何かありますか\ delimiterclass tokenizer()私はまだ c++ を学んでいるので、コードを大量に使用しないでください。

編集:ブーストライブラリがインストールされていなかったため、このエラーが発生していました。tokenize誰かが3 番目のライブラリをインストールせずにストリングを作成するためのより良い方法を説明できれば、非常に助かります。

一番; デッドコーダー。

4

3 に答える 3

3

C++ (および C ベースの他の言語) では\、文字列または文字リテラル内の文字はエスケープ文字です。これは、リテラルの次の文字をエスケープすることを意味します。これは、たとえば、"文字列内に a をまったく含めることができるようにするためです。文字列リテラルの\中に を含めるには、バックスラッシュを 2 つ使用してエスケープする必要があります"\\"

C++ で有効なエスケープ シーケンスの詳細については、このリファレンスなどを参照してください。


Boost の問題については、コンパイラにどこにインストールしたかを伝える必要があります。これは、IDE のプロジェクト プロパティで行います。


Boost などのサードパーティ ライブラリを使用せずにトークン化する場合は、いくつかの方法があります。1 つの方法はstd::istringstream、 andを使用することstd::getlineです。もう 1 つは、標準クラスのfindおよび関数を使用します。substrstring

于 2013-02-22T17:07:10.567 に答える
2

ここで一般化されたトークナイザーはどれもやり過ぎです。を使用 std::find( s.begin(), s.end(), '\\' )して各セパレーターを検索し、2 つの反復子コンストラクターを使用std::stringしてそれを別の文字列に入れます。(コンパイラは最初\の文字をエスケープ文字として扱います)。

std::vector<std::string> fields;
std::string::const_iterator end = s.end();
std::string::const_iterator current = s.begin();
std::string::const_iterator next
        = std::find( current, end, '\\' ):
while ( next != end ) {
    fields.push_back( std::string( current, next ) );
    current = next + 1;
    next = std::find( current, end, '\\' );
}
fields.push_back( std::string( current, next ) );

トリックを行う必要があります。

于 2013-02-22T17:20:05.417 に答える
1
char_separator<char> sep("\") 
                          ^^^ You need to escape the \ . use "\\" 

これ\は、エスケープ シーケンスを示すために使用されます。しかしto escape that escape, you need other escape

これを使って :char_separator<char> sep("\\")

ブースト ライブラリをインストールするには: Boost をインストールします。

他の選択肢:

getline(fin,tempStr);
char *cstr=new char[tempStr.length()+1];
strcpy(cstr,tempStr.c_str())

//... Now you can use strtok() on cstr
于 2013-02-22T17:07:17.033 に答える