Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用python代替C+读取二进制文件的替代方法+; 我有一个二进制文件和C++代码,可以读取如下的二进制文件。 int NumberOfWord; FILE *f = fopen("../data/vec.bin", "rb"); fscanf(f, "%d", &NumberOfWord); cout << NumberOfWord< <endl;_Python_C++ - Fatal编程技术网

用python代替C+读取二进制文件的替代方法+; 我有一个二进制文件和C++代码,可以读取如下的二进制文件。 int NumberOfWord; FILE *f = fopen("../data/vec.bin", "rb"); fscanf(f, "%d", &NumberOfWord); cout << NumberOfWord< <endl;

用python代替C+读取二进制文件的替代方法+; 我有一个二进制文件和C++代码,可以读取如下的二进制文件。 int NumberOfWord; FILE *f = fopen("../data/vec.bin", "rb"); fscanf(f, "%d", &NumberOfWord); cout << NumberOfWord< <endl;,python,c++,Python,C++,我想用python重新实现上面的代码 with open("../data/vec.bin","rb") as f: b = f.read(8) print struct.unpack("d",b)[0] 但是这个代码不起作用。 我的输出是: 114042 8.45476330511e-53 我的问题是: 为什么在C++中有8个字节? 我从来不知道%d的意思是双重的。 但是,实际上变量有一个整数类型,但是通常我们在C++中使用“%d”输出。 这很奇怪 2) 如何在pytho

我想用python重新实现上面的代码

with open("../data/vec.bin","rb") as f:
    b = f.read(8)
    print struct.unpack("d",b)[0]
但是这个代码不起作用。 我的输出是:

114042
8.45476330511e-53
我的问题是:

<整数>为什么在C++中有8个字节?

我从来不知道%d的意思是双重的。 但是,实际上变量有一个整数类型,但是通常我们在C++中使用“%d”输出。 这很奇怪

2) 如何在python中提取实数

我想在Python代码中提取一个类似于C++代码的实数。 我该怎么做


也许,我误解了python中的结构模块。

在C格式字符串中,
%d
是十进制的缩写

with open("../data/vec.bin","rb") as f:
    b = f.read(8)
    print struct.unpack("d",b)[0]
在Python中,
d
是double的缩写

如果它是整数,则应在
struct.unpack
call中使用
i

with open("../data/vec.bin","rb") as f:
    b = f.read()
    print struct.unpack("i",b)[0]

因为您已经能够用这个C++(或相当的C)行正确读取文件,<代码> fSCANF(f,%d),和No.Objo Word;代码>,我假设您的文件包含114042的文本表示形式。所以它包含字节

0x31 0x31 0x34 0x30 0x34 0x32…
'1','1','4','0','4','2',…

在文本编辑器中打开它时,可以看到一行
114042

现在,当您尝试使用
i
格式将if读取为二进制时,您使用文件的前4个字节并实际获得
int('31313034',16)
:825308208。我无法复制您使用
d
格式得到的结果,将其解码为双精度,因为我无法猜到您的文件中最后一位数字之后会出现什么

如果第一行只有一个数字,很简单:只需读取一行并将其转换为整数:

with open("../data/vec.bin","rb") as f:
    print int(f.readline())
with open("../data/vec.bin","rb") as f:
    line = f.readline()
    m = re.match(t'\s*\d*', line)
    print(int(m.group(0)))
如果最后一个数字后面还有其他字符,则必须首先使用正则表达式(不要忘记导入
re
)获取数值,然后将其转换为整数:

with open("../data/vec.bin","rb") as f:
    print int(f.readline())
with open("../data/vec.bin","rb") as f:
    line = f.readline()
    m = re.match(t'\s*\d*', line)
    print(int(m.group(0)))

TL/DR:不要试图读取文本文件,就好像它包含二进制表示法一样

Nebrils的答案可以。我想补充一点,Python中的十进制格式说明符也是“d”,例如,
printf(“%d”,42)对应于Python中的print(“{0:d}”%42)。我是喝醉了还是
fscanf(…,“%d”,)
是用来阅读文本文件的???谢谢大家
fscanf(…,“%d”,)
用于此时读取二进制文件。谢谢!我不知道有什么区别。但是,我用“我”运行,就像你的代码一样。但是我的python输出是808726833。这与C++的输出不同。你知道吗@田中博貴: 正如我在评论中已经说过的,你试图把一个文本文件读成二进制结构,这是没有意义的…@SergeBallesta:谢谢。成功了。C++代码和二进制文件由他人制作。也许,我误解了阅读二进制和文本的区别。谢谢你礼貌的回答。我明白问题是什么。因此,数据文件可能很奇怪,因为它包含文本和二进制。在Python中,混合二进制和文本io比在C中要困难得多,因为在文本读取之后,您无法获得文件位置:Python库读取了一个完整的缓冲区,文件指针通常远远超出了行的末尾。你应该(在另一个问题中是IMHO)解释你想要阅读的文件的结构,