通过fstream读取文件时,存储在变量中的损坏数据..为什么?
Corrupt data being stored in variable upon reading file via fstream...why?
当我输出下面看到的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终止符。当缓冲区不足时,你很幸运,最后有一个零,当缓冲区较长时,就会有非零数据。
相关文章:
- 为什么C中的通用链表中存储的数据已损坏
- 两个垫子的 OpenCV 数据是相同的,但使用 Mat::at 检索时的值已损坏
- 类数组正在损坏数据
- 带有zip_source_buffer的libzip会导致数据损坏和/或segfault
- 发送特定字节模式时串行端口数据损坏
- 放置在外部 DLL 中的类中的字符串数据的内存损坏
- Winapi ReadFile返回损坏的数据
- 向量元素数据损坏了Find()操作
- Boost 的数据驱动测试的联接运算符"+"损坏了第一列
- 为什么链表中的数据在嵌套函数中会更改/损坏?
- 写入文本文件的数据部分损坏且无法恢复
- recv() 获取损坏的数据
- 数据结构中的双重释放或损坏
- 通过fstream读取文件时,存储在变量中的损坏数据..为什么?
- 如何在不损坏数据的情况下将缓冲区强制转换为结构
- ZeroMQ消息损坏数据
- 加载前请检查文件创建者,以防止篡改/损坏数据
- C++ pthreads 和结构的损坏数据
- 增强序列化-在反序列化损坏数据时不再出现archive_exception
- c++ UDP套接字在一定频率上损坏数据包