fscanf在ctype python调用中不起作用

fscanf在ctype python调用中不起作用,python,c,ctypes,scanf,Python,C,Ctypes,Scanf,我试图围绕google的word2vec,使用ctypes在python中为新闻组预先训练向量 我这里有一段代码: void initialize(){ ... long long words, size; char *fname = "GoogleNews-vectors-negative300.bin.gz"; strcpy(file_name, fname); printf("%s\n", file_name); f = fopen(file_name, "rb")

我试图围绕google的word2vec,使用ctypes在python中为新闻组预先训练向量

我这里有一段代码:

void initialize(){
  ...
  long long words, size;
  char *fname = "GoogleNews-vectors-negative300.bin.gz";
  strcpy(file_name, fname);
  printf("%s\n", file_name);
  f = fopen(file_name, "rb");
  if (f == NULL) {
      printf("Input file not found\n");
      return -1;
  }

  fscanf(f, "%lld ", &words);
  fscanf(f, "%lld", &size);
  printf("size of words is %d\n", words);
  ...
}
当我从主函数调用它时,这段代码运行良好。然而,当我把它编译成一个.so文件并从ctypes调用它时,单词总是为零。在检查ftell时,我注意到fscanf不会向前移动文件指针,并且fscanf始终返回0。它是一个二进制文件,所以我不确定fscanf除了将这个3GB的二进制文件转换成更大的.csv文件并从那里读取之外还能做什么


如何解决这个问题?在这种情况下,避免fscanf的备用路线也会起作用

OP的文件是一个压缩文件“GoogleNews-vectors-negative300.bin.gz”,代码设计用于读取未压缩版本


重新尝试使用未压缩的版本。

我不是ctypes方面的专家,但它所理解的内容之间是否存在冲突“作为
long
,C编译器在字节数方面做了什么?您可以在中检查类型表,也许它可以帮助您。@lord我检查了long-long的大小,它在两种ctypes和我的机器上都对应于8个字节,大小为sizeof(long-long)。我看不出这有什么关系,因为执行完全在C端。@chux当我调整时,fscanf返回0,根据手册页,这表示早期失败,但我不确定为什么只有在python调用时才会发生这种情况。@Artisv对此表示抱歉。IAC:当
fscanf()返回0时,使用
int ch=fgetc(f)
读取有问题的
字符
,然后报告。我怀疑该文件是用二进制文件编写的(注意“rb”),代码需要使用
fread()
来读取二进制文件,而不是
fscanf()
来读取文本表示形式。“GoogleNews-vectors-negative300.bin.gz”是压缩文件吗?如果是这样,那么有一种方法可以解压缩文件并动态地将其输出作为代码的输入。我已经有一段时间没有这样做了。(使用stdin很容易)