1

以下に示すInitialSeedFinder関数の戻り値(シード変数に格納されている値)を出力すると、予期される文字列値を破損するランダムなASCII文字がいくつか取得されます。これは、バッファが2文字を超える場合にのみ発生します(つまり、順序変数が3未満の場合に機能します)。

このエラーは、以下のコードに見られるwhileループで発生しています...

なぜこれが起こっているのか誰かが説明できますか?read()関数がどのように機能するかと関係がありますか?

string InitialSeedFinder(int order, string fileName){
    string seed; 
    ifstream inputStream;
    Map<string, int> frequencyMap;
    inputStream.open(fileName.c_str());
    int offset = 0;
    inputStream.clear();
    char* buffer = new char [order];

    //get all k char sequence
    while (inputStream.get() != EOF) {    
        inputStream.seekg(offset);
        inputStream.read(buffer, order);
        string key(buffer);
        if (frequencyMap.containsKey(key)) {
            frequencyMap[key] = frequencyMap[key] + 1;
        }
        else {
            frequencyMap.put(key, 1);
        } 
         offset++;
    }
    inputStream.close();

  //go through and find the most frequent key
    int greatestFrequency = 0;
    int frequency = 0;
    foreach(string key in frequencyMap)
    {
        frequency = frequencyMap[key];
        if (frequency > greatestFrequency) {
            greatestFrequency = frequencyMap[key];
            seed = key;
        }
    }

    return seed;
}
4

1 に答える 1

1

文字列の場合、read()はターミネータを末尾に追加しません。ただし、char *を文字列にキャストする場合は、nulターミネータが必要です。バッファが不足していると幸運になり、最後にゼロがあり、長くなるとゼロ以外のデータがありました。

于 2012-08-20T06:01:36.427 に答える