fread/ftell 在 Windows 下明显损坏,在 Linux 下工作正常

2024-04-09

所以问题是,我正在读取我的游戏的关卡文件,在 Linux 下运行良好:

@0
@12
200x200 version 3
@16
973 blocks
@989
@993
18 zones

但在windows下我得到以下结果:

@0
@212
200x200 version 3
@216
973 blocks
@1200
@1204
18 zones

呃? Windows ftell 统计数据偏移量为 200?读取文件显然会产生相同的数据,但 fread 使用(?)ftell 的值来确定文件中还剩多少字节可以读取。当然,我在阅读文件末尾时遇到了问题:

@1425
zone#9 2x3 @ 66/9
@1425
zone#10 2x3 @ 66/9
@1425
zone#11 2x3 @ 66/9
@1425
zone#12 2x3 @ 66/9
@1425
zone#13 2x3 @ 66/9
@1425
zone#14 2x3 @ 66/9
etc.

这是相应的代码(由于所有调试打印,目前有点丑陋..):

void fread_all(void *ptr, size_t size, size_t count, FILE *stream) {
    fread(ptr, size, count, stream);
    printf("@%ld\n", ftell(stream));
}


bool map_load(struct Map *map, const char *file_name) {
    FILE *fp = fopen(file_name, "r");
    if (fp != NULL) {
        fseek(fp, 0, SEEK_SET);
        printf("@%ld\n", ftell(fp));

        // Header
        int *header = (int*)calloc(sizeof(int), 3);
        fread_all(header, sizeof(int), 3, fp);
        printf("%dx%d version %d\n", header[0], header[1], header[2]);

        map->pos_x = 0;
        map->pos_y = 0;
        map->map_x = 0;
        map->map_y = 0;
        map->size_x = header[0];
        map->size_y = header[1];
        map_zones_remove(map);        
        free(header);

        // Blocks
        unsigned int *block_size = (unsigned int*)malloc(sizeof(unsigned int));
        fread_all(block_size, sizeof(int), 1, fp);
        printf("%d blocks\n", *block_size);

        unsigned char *block_data = (unsigned char*)calloc(sizeof(unsigned char), *block_size);
        fread_all(block_data, sizeof(unsigned char), *block_size, fp);

        unsigned char *tmp = map->blocks;
        map->blocks = rle_decode(block_data, *block_size);
        free(tmp);
        free(block_size);
        free(block_data);

        // Zones
        int *zone_count = (int*)malloc(sizeof(int));
        fread_all(zone_count, sizeof(int), 1, fp);
        printf("%d zones\n", *zone_count);

        int *d = (int*)calloc(sizeof(int), 6);
        for(int i = 0, l = *zone_count; i < l; i++) {
            fread_all(d, sizeof(int), 6, fp);
            map_zone_create(map, d[0], d[1], d[2], d[3], d[4], d[5]);
            printf("zone#%d %dx%d @ %d/%d\n", i, d[2], d[3], d[0], d[1]);
        }
        map_platforms_create(map);

        free(zone_count);
        free(d);
        fclose(fp);
        return true;
    }
    return false;
}

我真的不知道这里发生了什么。编译器是Linux下的Visual Studio 10 1和GCC 4.4。


以二进制模式打开文件:

FILE *fp = fopen(file_name, "rb");

在文本模式下,可能会进行翻译以匹配操作系统相关的编码,例如C 库的换行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

fread/ftell 在 Windows 下明显损坏,在 Linux 下工作正常 的相关文章

  • 是否有一种快速替代方法可以从 XNA 中的位图对象创建 Texture2D?

    我环顾四周 发现从位图创建Texture2D的唯一方法是 using MemoryStream s new MemoryStream bmp Save s System Drawing Imaging ImageFormat Png s S
  • Lambda、封闭变量、显示类、可序列化性和流行层

    我已经为 Compact Framework 实现了一个流行层 包括BinaryFormatter 类似序列化器 我希望能够在适当的情况下序列化编译器生成的类 这些类是由 lambda 和迭代器等产生的 这样如果 例如 lambda 及其封
  • 如何将 list 对象附加到另一个对象

    在 C 中 我有两个list
  • 将 CryptoStream 解密为 MemoryStream

    我编写了一个过程 其中文件被加密并上传到 Azure 然后必须解密下载过程 这会失败并出现 填充无效且无法删除 错误 或 要解密的数据长度为无效的 错误 我在网上尝试了很多解决方案 包括C 使用 RijndaelManaged 和 Cryp
  • 无法使用 MinGW C++ 在 NetBeans IDE 7.3 中编译“Hello World”

    我正在尝试制作一个简单的 Hello World 在 NetBeans IDE 7 3 中使用 MinGW 作为我的 C 编译器来编写程序 我遇到了构建失败的情况 但我不知道为什么 这是我的编译器设置 Family MinGW 基本目录 C
  • EWS 消息跟踪报告

    我一直在研究如何使用 EWS 从交换中获取消息跟踪报告 但似乎无法查明任何内容 我打算构建一个抓取日志文件的应用程序 但如果我可以通过 EWS 来完成它 那对我正在做的事情会更好 有任何想法吗 我终于能够为我的问题创建一个解决方案 我在 C
  • Clang 使用 -nostdlib 生成崩溃代码

    我正在尝试为可执行文件设置自己的运行时环境 但无法使用 clang v3 4 1ubuntu1 目标 x86 64 pc linux gnu 来生成没有段错误的可执行文件 我已将问题简化为以下内容 如果我有一个文件 crt1 c 除了满足
  • 使用 Composer 安装 PHPUNIT

    我有一个关于 Symfony 2 的项目 我想在 Windows 7 上使用 PHPUNIT On githut phpunit is Composer Simply add a dependency on phpunit phpunit
  • 这个对象的内存会是什么样子?

    我想知道这个类 它的对象 的内存布局是什么样的 class MyClass string myString int myInt public MyClass string str int i myString str myInt i MyC
  • 枚举和枚举类之间的区别[重复]

    这个问题在这里已经有答案了 谁能解释一下两者之间的区别 enum Type1 type2 And enum class Type1 type2 我经常使用前者 可能太频繁而没有足够的封装 但我从未使用过第二个例子 Thanks enum A
  • 二叉树实现C++

    二叉树插入 include stdafx h include
  • C# SerialPort BaseStream ReadAsync - CancellationToken 从未取消?

    我尝试以异步方式从串行端口读取数据 请记住操作所花费的时间不得超过指定的时间段 我使用的代码 private async Task
  • 获取当前时间(以小时和分钟为单位)

    我正在尝试从系统收集信息 并且需要获取当前时间 以小时和分钟为单位 目前我有 date awk print 4 输出如下 16 18 54 怎样才能把秒数去掉呢 提供格式字符串 date H M Running man date将给出所有格
  • ASP.NET MVC - 路由 - 具有文件扩展名的操作

    有没有办法实现调用URLhttp mywebsite myarea mycontroller myaction xml这基本上是 假 请求文件 但结果将是一个为动态创建的文件提供服务的操作操作 我试过这个 context MapRoute
  • 初学者友好的方法来获取所有文件和目录的列表

    使用 NET 3 0 我得到了下面的方法 它可以正确返回指定目录的所有文件和目录 以及子目录 的集合 如果可能的话 我想将其简化为仅使用我非常熟悉的结构 具体来说 有以下几点我不太清楚 1 IEnumerable
  • 使用C#在SQL Server上执行sql文件

    我有很多程序 视图 函数等文件 我想在 SQL Server 2005 2008 上的适当数据库中执行这些文件 创建组件 还有一点是我想使用 C 来执行它们 另一点需要提及的是 我希望应用程序也可以在远程 SQL Server 上执行此文件
  • 如何在 C++ 中打印变量的名称? [复制]

    这个问题在这里已经有答案了 可能的重复 在C中获取变量名称的编程方法 https stackoverflow com questions 1623111 programmatic way to get variable name in c
  • 在.Net中使用ObjectCache缓存对象并设置过期时间

    我陷入了一个场景 我的代码如下 更新 它不是关于如何使用数据缓存 我已经在使用它及其工作 它是关于扩展它 以便该方法在到期时间和从外部源获取新数据之间不会进行调用 object string this GetDataFromCache ca
  • 我该怎么做才能完全关闭与mcu的tcpClient连接?

    我现在正在研究与 ESP32 中运行的 tcp 服务器的 tcp 套接字连接 通信工作正常 但我无法关闭连接 在搜索关闭 重置 tcpClient 上的解决方案后 似乎关闭 tcpClient 的正确方法应该是 tcpClient GetS
  • Kubernetes Pod 已终止 - 退出代码 137

    我需要一些关于 k8s 1 14 和在其上运行 gitlab 管道所面临的问题的建议 许多作业都会抛出退出代码 137 错误 我发现这意味着容器突然终止 集群信息 库伯内特版本 1 14 使用的云 AWS EKS 节点 C5 4xLarge

随机推荐

  • Delphi7,创建组合框项

    我想使用组合框为用户提供多种选项 所以有2个组合框 第一个大约有 5 个选项 第二个项目将根据用户在第一个组合框中选择的内容创建 到目前为止 我已经尝试过 Combobox2 Items Strings 1 xxxx 这让我出现这个错误 L
  • 如果复制列表初始化允许显式构造函数,可能会出现什么问题?

    在 C 标准 13 3 1 7 over match list 中 有以下规定 在复制列表初始化中 如果explicit选择了构造函数 初始化格式错误 这就是为什么我们不能做这样的事情的原因 struct foo explicit beca
  • 如何在 UIImageView 之上添加交互式 UILabels?

    我需要在上面添加一些标签UIImageView 可以通过点击标签来更改标签的文本 实现这一目标的最佳方法是什么 我正在使用 Swift 编程语言 在 stackoverflow 上查找一些解决方案 我发现了一些使用的演练String dra
  • 从哪里可以获得最新的 ANSI C 标准文档 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 在哪里可以找到最新的 ANSI C
  • Nginx 自定义 PHP error_pages 具有不同的标头状态代码和正文内容

    使用 Nginx 0 8 54 我设置 PHP 错误页面来对某些链接进行重定向 对其他链接进行 404 重定向并显示自定义 HTML 正文 nginx server error page 404 err error php error 40
  • Mercurial Hook - 更改提交前的提交消息

    Edit制作这个基本钩子是为了防止分支名称和提交消息 bugID 不匹配 https gist github com 2583189 https gist github com 2583189 所以基本上的想法是 如果分支名称类似于 bug
  • SQL Server 2016 SSMS Json 格式

    我正在 SQL Server 2016 的 SSMS 中使用 JSON 有没有办法解决 FOR JSON 语句的结果显示为 XML 列的问题 是否有任何设置更改 附加组件 外部工具等 甚至黑客可以减轻这种痛苦 在我的理想世界中 单击 JSO
  • 如何确定 HBase 表的大小?有什么命令可以这样做吗?

    我的 Hbase shell 上有多个表 我想将它们复制到我的文件系统上 有些表超过 100GB 但是 我的本地文件系统中只剩下 55GB 可用空间 因此 我想知道 hbase 表的大小 以便我可以仅导出小尺寸的表 任何建议表示赞赏 谢谢
  • css 星级 html

    我正在关注此页面上的教程 http www henryhoffman com css star rating tutorial html http www henryhoffman com css star rating tutorial
  • GWT序列化问题

    我在返回一个通过 RPC 实现 IsSerialized 的对象的 ArrayList 时遇到了很大的麻烦 IsSerialized pojo 包含一个变量 一个字符串 并具有一个 0 参数构造函数 我已经从我的战争中删除了 gwt rpc
  • NSAttributedString initWithData:options:documentAttributes:error: 非常慢

    我使用这些代码行从简单的 HTML 字符串创建属性字符串 NSDictionary importParams NSDocumentTypeDocumentAttribute NSHTMLTextDocumentType NSCharacte
  • 名为 isActive 的布尔变量的 setter

    我的 pojo 类中有一个名为 isActive 的属性 当我使用 Eclipse IDE 生成此属性的访问器时 它会生成以下 getter 和 setter Getter isActive Setter setActive 但是 当我尝试
  • 选择当前单词的多个实例并更改它们的 vim 方法是什么?

    任何熟悉 Sublime Text 的多光标功能的人都会认识到执行以下操作的模式 多次按热键以选择光标下单词的多个实例 并自动为每个实例创建一个新光标 然后同时编辑每个实例 例如通过用另一个单词或任何您想要的单词替换当前单词 vim 可以通
  • 使 div 不自动拉伸到容器宽度

    我的问题很简单 您能否阻止 div 自动拉伸到其包含元素的宽度 并使其仅水平拉伸到其内部内容所强制的程度 有点像 div 的默认垂直行为 但水平应用 这可能吗 你必须设置display财产给inline block div style di
  • 通过复制另一个 pdf 中的数据来创建新 pdf

    我有一个 pdf 文件 其中包含一些内容 它实际上是一个模板 我已设法从 pdf 中读取内容并根据要求进行更改并将其保存在字符串变量中 现在我必须创建一个新的 pdf 文件 该文件将进行更改 并且初始模板文件不会更改 为了提高透明度 我附上
  • 如何分叉 monorepo 的一部分并且仍然能够合并上游提交?

    Sometimes I find monorepo https github com babel babel blob master doc design monorepo md on GitHub that consists of mul
  • Str::slug 替代印地语和阿拉伯语字符串?

    I use Str slug但是 要生成友好的 URLStr slug 方法返回null在阿拉伯语和印地语字符串上 可能还有中文 日文 韩文和那些字符集 例如 return Str slug null 我怎样才能有效地解决这个问题 我在使用
  • 在 Solr DataImportHandler 中从 Oracle 日期获取正确时间

    我正在尝试使用 Solr 的 DataImportHandler 从 Oracle DB 中索引一些文档 除了将 Oracle Date 列正确读取到我的文档中之外 一切工作正常 我的 Solr 架构中的字段定义为
  • 当类声明似乎有两个名称时,这意味着什么?

    我试图理解一些具有以下类语法的 C 代码 class Q MONKEY EXPORT BasePlugin public QObject some code comes here 我无法理解语法class Q MONKEY EXPORT B
  • fread/ftell 在 Windows 下明显损坏,在 Linux 下工作正常

    所以问题是 我正在读取我的游戏的关卡文件 在 Linux 下运行良好 0 12 200x200 version 3 16 973 blocks 989 993 18 zones 但在windows下我得到以下结果 0 212 200x200