我试图使用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个字节左右),它出错并且所遵循的一切都是错误的。那是为什么?
答案 0 :(得分:2)
对于starter,您应该打开二进制读写的文件流:
std::ofstream os (FilePath,std::ios::binary);
(编辑:假设char真的意思是“签名字符”)
请注意,常规char
最多可以包含CHAR_MAX/2
值,即127。
如果随机数较大 - 结果将环绕,导致负值。流将尝试将此字符写为文本字符,这是无效的写入值。二进制格式至少应该解决这个问题。
另外,你不应该在这里自己关闭流,析构函数会为你做。
另外两个简单点:
1)&(data[0])
应该只是&data[0]
,()
是多余的
2)尝试保持相同的约定。你为FilePath
变量编写了upper-camel-case,但是为所有其他变量编写了lower-camel-case。