【问题标题】:reading bytes from a file to short / long integer从文件中读取字节到短/长整数
【发布时间】:2012-12-24 20:00:31
【问题描述】:

大家好!我正在尝试读取文件的前 4 个字节并将它们存储在整数变量中。 这就是我正在做的事情:

#include <iostream>
#include <fstream>
#include <iomanip>
#include <cstring>

using namespace std;

int main(){
    ifstream is;
    is.open ("binary_file.dat", ios::binary );
    char file_version[4];
    is.read(file_version, 4);
    int fv_int;
    memcpy(&fv_int, file_version, sizeof(fv_int));
    cout << fv_int;
}

但结果并不是我想的那样。程序将文件的第一个字节复制到正确的位置,但将其余字节视为 0。示例:

我的文件的前 4 个字节:

10101010 00101100 00101100 00101100

程序执行后fv_int的内容是什么:

10101010 00000000 00000000 00000000

有没有办法访问特定的整数字节?还是从文件中读取字节的更好方法?

【问题讨论】:

  • 你就不能is.read(&amp;fv_int, 4);吗?另外,你为什么假设int 是 4 个字节长?
  • 您应该使用int32_t(来自 stdint.h)而不是 int,因为 int 的大小因平台而异。这可能无法解决您的问题,但它会使您的代码更具可移植性。
  • @H2CO3: C++ std::istream::read() 需要一个指向 char 的指针。悲伤但真实。
  • @JohnZwinck 该死的 C++ 的严格类型系统。
  • 感谢@JohnZwinck 的建议

标签: c++ integer byte


【解决方案1】:

istream::read 不完全读取 4 个字节,它返回读取的字节数。检查返回值,你的文件可能太短了

附加提示: 您可以使用is.read(reinterpret_cast&lt;char*&gt;(&amp;fv_int), size_of(fv_int)); 来减少代码量并增加详细程度

【讨论】:

  • 我的文件是 200 kBytes,所以肯定不会太短;P 函数返回 *this。
  • 哦,抱歉 readsome 返回 number =) 而不是检查流错误。添加类似if(!is) cout &lt;&lt; "error"
【解决方案2】:

如果我为您的程序提供前 4 个字节的文件,它会完美地读取并显示它们。如需进一步诊断,请将最后一个 cout 更改为:cout &lt;&lt;sizeof(int)&lt;&lt;" "&lt;&lt;hex&lt;&lt;fv_int&lt;&lt;endl;

【讨论】:

  • 奇怪,我正在检查十六进制编辑器,我确定它不能正常工作。
  • hexdump -C binary_file.dat 给了我:00000000 f0 f1 f2 f3 ...,而你的程序(改变了 cout)给了我:4 f3f2f1f0,这是正确的,因为我使用的是英特尔处理器
  • 啊,看来我误解了十六进制编辑器。你是对的,代码有效,真是一种解脱。谢谢大家
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 2011-12-04
  • 1970-01-01
相关资源
最近更新 更多