首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >写入和读取文件

写入和读取文件
EN

Stack Overflow用户
提问于 2015-10-11 13:23:57
回答 1查看 66关注 0票数 2

我试图使用ifstream/ofstream来读/写,但由于某种原因,数据在执行过程中会被破坏。下面是读/写方法和测试:

代码语言:javascript
复制
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字节左右)它出错了,接下来的一切都是错误的。为什么会这样呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-11 13:33:06

对于初学者,您应该打开文件流进行二进制读写:

代码语言:javascript
复制
std::ofstream os (FilePath,std::ios::binary);

(编辑:假设字符实际上指的是“签名字符”)

请注意,常规char可以保持CHAR_MAX/2值,即127。如果随机数更大,结果会被包围,从而产生负值。流将尝试将此字符写入文本字符,这是要写入的无效值。二进制格式至少应该解决这个问题。

另外,您不应该自己关闭流在这里,析构器为您做它。

还有两个简单的要点:

1) &(data[0])应该是&data[0]()是多余的

2)尽量保持同样的惯例。您为FilePath变量编写上camel大小写,而为所有其他变量编写下camel大小写。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33065486

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档