我试图使用ifstream/ofstream来读/写,但由于某种原因,数据在执行过程中会被破坏。下面是读/写方法和测试:
void FileWrite(const char* FilePath, std::vector<char> &data) {
std::ofstream os (FilePath);
int len = data.size();
os.write(reinterpret_cast<char*>(&len), 4);
os.write(&(data[0]), len);
os.close();
}
std::vector<char> FileRead(const char* FilePath) {
std::ifstream is(FilePath);
int len;
is.read(reinterpret_cast<char*>(&len), 4);
std::vector<char> ret(len);
is.read(&(ret[0]), len);
is.close();
return ret;
}
void test() {
std::vector<char> sample(1024 * 1024);
for (int i = 0; i < 1024 * 1024; i++) {
sample[i] = rand() % 256;
}
FileWrite("C:\\test\\sample", sample);
auto sample2 = FileRead("C:\\test\\sample");
int err = 0;
for (int i = 0; i < sample.size(); i++) {
if (sample[i] != sample2[i])
err++;
}
std::cout << err << "\n";
int a;
std::cin >> a;
}它正确地写入长度,正确地读取它并开始正确地读取数据,但是在某个点(取决于输入,通常在1000字节左右)它出错了,接下来的一切都是错误的。为什么会这样呢?
发布于 2015-10-11 13:33:06
对于初学者,您应该打开文件流进行二进制读写:
std::ofstream os (FilePath,std::ios::binary);(编辑:假设字符实际上指的是“签名字符”)
请注意,常规char可以保持CHAR_MAX/2值,即127。如果随机数更大,结果会被包围,从而产生负值。流将尝试将此字符写入文本字符,这是要写入的无效值。二进制格式至少应该解决这个问题。
另外,您不应该自己关闭流在这里,析构器为您做它。
还有两个简单的要点:
1) &(data[0])应该是&data[0],()是多余的
2)尽量保持同样的惯例。您为FilePath变量编写上camel大小写,而为所有其他变量编写下camel大小写。
https://stackoverflow.com/questions/33065486
复制相似问题