写和读文件

时间:2015-10-11 13:23:58

标签: c++ file

我试图使用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个字节左右),它出错并且所遵循的一切都是错误的。那是为什么?

1 个答案:

答案 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。