gpt4 book ai didi

c++ - ifstream 不加载整个文件

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

这个主题的名称可能不正确,但我不知道如何命名这个问题。关于背景,我正在编写一款游戏,其中 3d 表面被分成 block 。我想到了一种保存机制,其中所有 block 对象及其属性都以压缩形式保存到无序映射中,然后序列化到文件中,因此可以根据当前需要有效地加载和保存世界的各个部分。当然,在加载的时候,文件被加载,反序列化为无序映射,字符串被实时转换为chunks对象。这是一个计划,但在实现方面存在困难。

我尝试了所有可能的搜索,但没有结果。在我玩测试的过程中,我写了一个像这样的小测试脚本:

#include <iostream>
#include <fstream>
#include <sstream>

int main()
{
std::ifstream reader("output.dat", std::ios::binary);
std::string data;
reader>>data;
reader.close();
std::cout<<data.size()<<std::endl;

std::stringstream ss;
ss.str(data);

unsigned char id_prefix=0, zone_prefix=1;
while (ss.peek()!=EOF)
{
unsigned char type;
ss>>type;
if (type==id_prefix)
{
unsigned char tempx, tempy, tempz;
unsigned short tempid;

if (!(ss>>tempx)) std::cout<<"reading of x failed."<<std::endl;
if (!(ss>>tempy)) std::cout<<"Reading of y failed"<<std::endl;
if (!(ss>>tempz)) std::cout<<"Reading of z failed."<<std::endl;
if (!(ss>>tempid)) std::cout<<"Reading of id failed, position is "+std::to_string(ss.tellg())+", values are "+std::to_string(type)+" "+std::to_string(tempx)+" "+std::to_string(tempy)+" "+std::to_string(tempz)<<std::endl;

std::cout<<(int)tempx<<" "<<(int)tempy<<" "<<(int)tempz<<" "<<(int)tempid<<std::endl;
}
else if (type==zone_prefix)
{
unsigned char tempx, tempy, tempz;
unsigned int tempzone;
ss>>tempx;
ss>>tempy;
ss>>tempz;
ss>>tempzone;
std::cout<<(int)tempx<<" "<<(int)tempy<<" "<<(int)tempz<<" "<<(int)tempzone<<std::endl;
}
}

}

Output.dat 是一个包含一个实验性解压 block 的文件,用于重现游戏中的解析过程。您可以从以下网址下载: https://www.dropbox.com/s/mljsb0t6gvfedc5/output.dat?dl=1如果需要,它的大小约为 160 kb。这是第一个问题。这可能只是我的愚蠢,但我认为当我使用 std::ios::binary 打开 ifstream,然后将其内容提取到字符串时,它会加载整个文件,但它只加载了前 46 个字节。这是第一个问题,接下来在游戏中,我使用其他系统加载有效的数据,但是在代码的下半部分可以看到字符串流处理在这个位置也失败了。我猜数据也有问题,正如你所看到的,格式是uchar类型(指示后面的字节是指id还是zone),坐标(每个都是uchar),如果是id,则为ushort,如果是zone,则为uint。但是当我用我自己创建的二进制编辑器查看文件时,它显示 id 只有一个字节,而不是我从 short 值中期望的两个。保存也是用 stringstream 完成的,形式如下:unsigned short tempid=3;//示例值SS<

在结果文件中,它表示为 51(一个字节),3 的 ascii 代码是什么,所以我有点困惑,或者只是一点点。

你能帮我解决这个问题吗?我在 win7 64 位上使用 Mingw g++ 4.9.3。

非常感谢!

从 1.1.2017 开始编辑

现在整个文件都在字符串流中读取,但提取值仍然失败。当 >> 提取读取到下一个空格时,提取到 unsigned short 时如何?我在玩代码位,试图将 unsigned short tempid 更改为 unsigned char tempid。输出对我来说没有意义。简而言之,字节如下:0;1;0;0;51被读作类型 0、x 1、y 0、z 0 和 id 3 什么是正确的,即使我不明白为什么这里是 51 而不是 3。之前写入流似乎是:

unsigned short idtowrite=3;
ss<<idtowrite;

但是当我将 unsigned short tempid 更改为 unsigned char tempid 时,它读取为类型 0、x 1、y 0、z 0 和 id 51,这是不正确的,但我希望它来自写入的文件。如果它通过完整流正确读取,我不会解决它,但由于某种原因,直到 0;8;0;0;51 都是正确的,并且从 0;9;0;0;51 开始,它旁边失败, x 读为 0,y 读为 0,z 读为 51,并设置 EOF。我在想阅读是否没有遗漏一个字节,但我看不出这样做的理由。您能否向我推荐一些如何在 stringstream 中存储值的有效且可行的方法?

提前致谢!

最佳答案

std::ios::binary 仅具有抑制行尾转换的效果(因此文件中的 \r\n 不会转换为只是 \n 在内存中)。在处理二进制文件时提供这个当然是正确的。

但是,>>> 仍然是一个格式化 输入函数,它会跳过前导空格,在空格处终止等等。

如果你想实际读取文件作为二进制数据,你必须使用 read流对象上的函数。

关于c++ - ifstream 不加载整个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48038101/

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