2017-03-16 13 views
2

私のpull_data関数が呼び出し時にクラッシュして「myMap [word] ++」行に絞り込まれた理由を理解できません。しかし、私が正しく理解すれば、それはうまくいくはずです。キー "word"を持つ要素が存在しない場合と同様に、要素が作成され、値が初期化されます。データをマップに読み込む問題

私の最初のバリエーションでは、2つの異なるファイルがプルされ、2つの異なるマップにデータが保存されます。

if (file.is_open()) { 
     while (file >> word) { 
      myMap[word]++; 
     } 
     file.close(); 
    } 
    else { 
     cout << "Unable to open file."; 
    } 

しかし、2つの異なるファイルから引き出すのではなく、私が必要とするすべてのデータを1つ読み込むようにしようとしています。私がオン側かオフ側から読んでいるかどうかを示す。

#include <iostream> 
#include <fstream> 
#include <map> 
#include <string> 

using namespace std; 

void pull_data(map<string, float>& myMap1, map<string, float>& myMap2); 
void push_data(map<string, float> myMap1, map<string, float> myMap2); 
void sync_data(map<string, float>& myMap1, map<string, float>& myMap2); 

int main() 
{ 
    map<string, float> offData; 
    map<string, float> onData; 

    pull_data(offData, onData); 

    sync_data(offData, onData); 

    push_data(offData, onData); 

    system ("PAUSE"); 

    return 0; 
} 

void pull_data(map<string, float>& myMap1, map<string, float>& myMap2) { 

    string word; 
    bool onOff = false; 
    ifstream file("Data.txt"); 

    if (file.is_open()) { 
     while (file >> word) { 

      if(word == "|" && onOff){ 
       onOff = false; 
      }else if(word == "|"){ 
       onOff = true; 
      } 

      if(onOff){ 
       myMap2[word]++; 
      }else{ 
       myMap1[word]++; 
      } 

     } 
     file.close(); 
    } 
    else { 
     cout << "Unable to open file."; 
    } 
} 

void push_data(map<string, float> myMap1, map<string, float> myMap2){} 

void sync_data(map<string, float>& myMap1, map<string, float>& myMap2){} 

DATA.TXT例

362 364 | 112 304 122 124 | 
364 304 901 116 | 351 303 112 | 
362 364 311 | 351 612 400 484 303 326 | 
+0

をあなたがキー[単語]で返されたデータの値を増やすべき「++」演算子を使用していますが、可能性があるのでされていますnullデータを持つ演算子++ crach。マップは、構文myisap = word(オペレータ "="を使用して)を使用して値を作成して初期化します –

+0

std :: strcmp –

答えて

2

あなたはfloatは、プリミティブデータ型で、コピーコンストラクトとDefaultConstructibleする要件を満たしていないマッピングされたデータ型を使用しているからです。

これは、ゼロ参照があり、演算子「++」を使用しているときにクラッシュする理由です。

はそれを確認してください:

http://en.cppreference.com/w/cpp/container/map/operator_at

http://en.cppreference.com/w/cpp/concept/CopyConstructible

+0

を使用するのではなく、文字列を==と比較することはできません。それは私が&を使用しない場合、関数が動作するマップを返すようにしてください。 – Marzdor

+0

Ok、@Marzdor、問題は何ですか?あなたがmyMapp [word] ++、または別の問題でクラッシュした理由は? –

+0

最後に、コンパイラは何を使用していますか? –

関連する問題