通过fstream读取文件时,存储在变量中的损坏数据..为什么?

Corrupt data being stored in variable upon reading file via fstream...why?

本文关键字:损坏 数据 为什么 变量 读取 fstream 文件 存储 通过      更新时间:2023-10-16

当我输出下面看到的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;
}

read()不会在字符串末尾添加终止符。但是,当将char*强制转换为字符串时,它需要一个nul终止符。当缓冲区不足时,你很幸运,最后有一个零,当缓冲区较长时,就会有非零数据。