2016-08-06 6 views
0

文字単位でテキストファイルを読み込もうとしています。私はファイルを読むために文字列を使用しています。ファイルを読み込むための私のコードは以下の通りです:はstd :: stringを別のstd :: stringの0番目のインデックスに設定できません

int main() 
{ 
    std::ifstream data; 
    data.open("C:\\Users\\Christian Dean\\Documents\\CodeLiteWorkspace\\CplusplusPractice\\src\\test_file.qz"); 
    std::string data_str; 
    int counter = 0; 
    data >> data_str; 
    for(int i = 0; i < data_str.length(); i++) 
    { 
     std::string tokenizer = data_str[i]; 
     if (tokenizer == "output") 
     { 
      counter++; 
     } 
    } 
    std::cout << counter << std::endl; 
    data.close(); 
    return 0; 
} 

あなたが見ることができるように、私は、forループ、私は、文字列data_strの0番目のインデックスに等しい文字列tokenizerを設定していました。しかしコンパイルするとき、それは誤り

`main.cpp:27:37: error: invalid conversion from 'char' to ''const char*' [-fpermissive].

私は本当に私は、文字によるファイルの文字を読むことができますどのように他を知らないを示しています。私はtokenizerをタイプcharとして設定しようとしました。しかし、私がプログラムを実行すると、counterの変数は0に等しいと言います。だから明らかにtokenizer変数をタイプにしても機能しませんでした。それが必要とされる場合

テキストファイルの内容は以下の通りです:

output: "Hello World 
+0

'tokenizer'に一度に1文字しか含まれていない場合、' tokenizer'の 'output'文字列に文字がどれだけ読み込まれるかはわかりません。 – Yakk

+0

Yakkのコメントを拡大するには、一度に1文字ずつ入力するだけで単語全体を見ることはできません。代わりに、 'data.eof()'がtrueを返すまで文字列を抽出した場合は、ファイル内の各単語を歩き回って比較することができます。 – nate

+0

自分のコメントでネイトの意図を誤解していますか?ループからeofへその他の情報:http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong – user4581301

答えて

3
std::string data_str; 

は、std::stringを定義する。

std::string tokenizer = data_str[i] 

std::stringを定義し、単一文字でstringを構築しようと試みます。 std::stringには、単一の文字を受け入れるコンストラクタがありません。

この単一の文字列を単語全体と比較すると、これはあなたがやりたいことではありません。

data >> data_str; 

は、空白で区切られたトークンを効果的に1つの単語と句読点で読み取ります。

ので

while (data >> data_str) 
{ 
    stripPunctuation(data_str); 
    if (data_str == "output") 
    { 
     counter++; 
    } 
} 

stripPunctuationvoid stripPunctuation(std::string & input)次のようになり、すべての句読点を削除するだろうが、私は唯一の簡単な例として、そのハックが含まれています。このアプローチはうまくいくが、より良い解決策は、changing the delimiter for cin (c++)のようなもので、あなたが取り除きたい句読点をすべて追加し、>>があなたのために仕事をするようにする。

は、その後、あなたは

// configure stream to treat punctuation as whitespace here 
while (data >> data_str) 
{ 
    if (data_str == "output") 
    { 
     counter++; 
    } 
} 

を取得すれば完了です。

+0

これは演算子=ではありません。 'std :: string foo = blah;'にはどこでも 'operator ='は含​​まれません。 – Yakk

+0

Gah。それは構造物になります。修正されます。 – user4581301

1

が単一charとるコンストラクタを持っていない

std::string tokenizer = std::string(1, data_str[i]); 

std::stringを試してみてください。しかし、使用しているコンストラクタのオーバーロードは、第2引数でcharをとり、最初の引数で指定された長さのcharの繰り返しを含むstd::stringを作成します。

+4

は、これがコンパイルされない理由を示しますが、OPを使用可能なソリューションに導く試みは行っていません。 – user4581301

関連する問題