gpt4 book ai didi

c++ - 写入和读取文件

转载 作者:搜寻专家 更新时间:2023-10-31 02:20:06 25 4
gpt4 key购买 nike

我正在尝试使用 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 个字节左右)它出错了,接下来的一切都是错误的。这是为什么?

最佳答案

首先,你应该打开文件流进行二进制读写:

std::ofstream os (FilePath,std::ios::binary);

(编辑:假设 char 真的意味着“signed char”)
请注意,常规 char 最多可以容纳 CHAR_MAX/2 值,即 127。如果随机数较大 - 结果将回绕,产生负值。流将尝试将此字符作为文本字符写入,这是写入的无效值。二进制格式至少应该解决这个问题。

此外,您不应该在这里自己关闭流,析构函数会为您完成。

再简单说两点:
1) &(data[0])应该只是&data[0]()是多余的
2)尽量保持相同的约定。您为 FilePath 变量编写大驼峰式,但为所有其他变量编写小驼峰式。

关于c++ - 写入和读取文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33065486/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com