2012-03-18 6 views
1

こんにちは私は、誰かが私がファイルから文字を読み込んでマップに挿入しているのかどうか疑問に思っていました。コードが動作しています。ファイルには、スペースがファイルに発生した時間を格納する必要があるため、どんな助けでも大変感謝しています。C++でファイル内のスペースを検出する

map<char, int> treeNodes; //character and the frequency 
ifstream text("test.txt"); 

while(!text.eof()) 
{ 
    text >> characters; 
    //getline(text,characters); 
    cout << characters; 
    if(treeNodes.count(characters) == 0) 
    { 
     if(isspace (characters)) 
     { 
      cout << "space" << endl; 
     } 
     else 
      treeNodes.insert(pair<char,int>(characters,1)); 
    } 
    else 
    { 
     treeNodes[characters] += 1; 
    } 
} 
+3

いくつかのピリオドとカンマを使用する必要があります。 –

+0

スペースには値があります。待ってください。 '' '' –

+1

これは宿題であれば、そのよう –

答えて

2

書式付き入力、つまり右シフトを使用する場合、デフォルトで空白をスキップします。operator>>()std::noskipwsを使用してこれをオフにすることはできますが、読んでみたいことの種類によってはそれほど幸せではありません。最善の方法は、おそらくフォーマットされていない入力、つまりstd::getline()のようなものを使用して、プログラム内のスペースに行を分割することです。

あなたはちょうどあなたがおそらくstd::istreambuf_iterator<char>を使用して、ちょうど(このコードはまた、他のいくつかの不必要な混乱を省略)ストリームの内容を反復処理したい場合は、任意の特定の文字が発生した回数をカウントしたい場合:

for (std::istreambuf_iterator<char> it(text), end(); it != end; ++it) { 
    ++treeNodes[*it]; 
} 

ご連絡先eof()の結果を、ストリームが最後に達したために最後の読み取りに失敗したかどうかを判断するのとは異なるものを使用します。

+0

はデフォルトでマップ値がゼロで初期化されていますか? – moooeeeep

+1

あなたの見方にもよりますが、私は「いいえ」と言います。添え字演算子を使用しているときにキーがマップに見つからない場合、キーとデフォルトのconstuctされた値で構成されるペアがマップに挿入されます。組み込み型の場合、初期化されていることを意味しますが、より一般的には、値はデフォルトで初期化されます。 –

0

charをintにキャストして、それがスペースのascii値と等しいかどうかをテストできませんでしたか?

+1

あなたはそれをintにキャストせずに文字を比較することができますか? ------- " – Griwes

+0

ええ、それは奇妙に見えるかもしれませんね:-) –

+2

待って、何?'(a == ''){...} '奇妙に見えますか? – Griwes

-1

私は本当に純粋なC++の方法でどのように行うのか分からないが、それはそれは確実に動作しません

#include <stdio.h> 

int main() 
{ 
    FILE *in = fopen("input.txt","r"); 

    string x; 
    int count; 

    for(int i=0;;i++) 
    { 
     fscanf(in,"%s",x); 

     if(x!='\0') //try " " if that didn't work 
     { 
      for(int i=0;i<x.size();i++) 
      { 
       if(x[i]==' ') //try " " if that didn't work 
       { 
        count++; 
       } 
      } 
     } 
     else 
     { 
      break; 
     } 
    } 
} 

C

で行うの方法です。あなたがそれに問題がある場合は、コメントを投稿してください。

+1

これは、私があなたが奇妙に見えるものを決定させるようにします。 **はそれほど多くの異なるレベルで動作していないので、それを見るのは無意味です!...そしてこれは**ではありません** Cではどのように行われますか? 'string'型について' string'を 'char [n]'に置き換えても、バッファオーバーランの可能性を生み出すのでC言語での処理とは異なります。 –

+0

私はすでにそれがうまく動作しないと言った... そして、私はあなたがCのライブラリを使用してC + +でそれを使用できることを言い忘れてしまったes。先行する空白について、私は彼がそのようなものを必要とは思わないと思う。 – TheNavigat

+0

練習のポイントはスペースを取ることだった。これらの部分が先頭に空白文字としてスキップされていたら、それは問題です! '%s'変換指定子が実際に空白をスキップすることを確認しました。 –

関連する問題