【问题标题】:Reading numbers from file in C从C中的文件中读取数字
【发布时间】:2015-11-20 05:50:38
【问题描述】:

我主要是一名 Python 程序员,但我一直在使用 C,因为 Python 对于图形来说太慢了(20 fps 移动分形 FTW)。虽然我遇到了一个症结... 我在十六进制编辑器中编写了一个小文件进行测试。当我尝试读取第一个字节 5A 时,它通过这样的程序正确地给了我 90...

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
FILE *data;
int main(int argc, char* argv[])
{
    data=fopen("C:\\vb\\svotest1.vipc","r+b");
    unsigned char number;
    fread(&number,1,1,data);
    printf("%d\n",number);
}

但是当我尝试将前四个字节 5A F3 5B 20 读入一个整数时,我得到 542896986

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
FILE *data;
int main(int argc, char* argv[])
{
    data=fopen("C:\\vb\\svotest1.vipc","r+b");
    unsigned long number;
    fread(&number,1,4,data);
    printf("%d\n",number);
}

应该是1525898016!!! 问题是它颠倒了字节顺序。嘎!当然!该程序的工作方式取决于机器。既然我们谈到了这个主题,即使是字节也不能在每台机器上工作!

所以我需要帮助...在 Python 中,我可以使用 struct.pack 和 struct.unpack 以任何格式(长、短、单、双、有符号、无符号、大端、小端)将数据打包成字节,并且打开它。我在 C 中需要这样的东西...我可以自己写,但我不知道怎么写。

【问题讨论】:

  • 如果您在快速访问文件时遇到问题,可以阅读有关 mmap 的信息。如果没有,请忽略我。

标签: c file byte


【解决方案1】:

处理这种可移植性的最简单方法可能是在将数据写入文件之前对数据使用htonl(因此文件将按网络/大端顺序排列)并在读取时使用ntohl(转换网络订单数据符合本地惯例,无论是什么)。

如果您需要做的不仅仅是一个类型的几个值,您可能需要为此目的研究一个更完整的库,例如 Sun XDR 或 Google Protocol Buffers

【讨论】:

  • 啊,是的,这看起来像我需要的。谢谢!
【解决方案2】:

我认为您可以找出(字节序)http://en.wikipedia.org/wiki/Endianness,然后读取字节顺序。

【讨论】:

    【解决方案3】:

    像这样?

    unsigned long bin = 0;
    unsigned char temp = 0;
    
    for(unsigned char i = 0; i < 4; i++) {
        fread(&temp,1,1,data);
        bin = (bin << 8) | temp;
    }
    

    这导致第一部分是最重要的。我想这就是你想要的。

    【讨论】:

    • 是的,当然...但是真的很奇怪的机器呢...我不知道...将整个内容存储为 32 位整数,但仍然称其为长...这些机器会混乱吗向上?我希望这段代码是可移植的,而不仅仅是在我的电脑上可用。
    猜你喜欢
    • 2020-08-16
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 2012-11-10
    • 1970-01-01
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多