c# - 需要将 C++ 转换为 C# 的帮助

标签 c# c translation

我不太了解C++,尤其是IO部分。谁能帮我将下面的 C++ 代码翻译成 C# 吗?

unsigned *PostingOffset, *PostingLength, NumTerms;

void LoadSubIndex(char *subindex) {
  FILE *in = fopen(subindex, "rb");
  if (in == 0) {
    printf("Error opening sub-index file '%s'!\n", subindex);
    exit(EXIT_FAILURE);
  }
  int len=0;
  // Array of terms
  char **Term;
  char *TermList;
  fread(&NumTerms, sizeof(unsigned), 1, in);
  PostingOffset = (unsigned*)malloc(sizeof(unsigned) * NumTerms);
  PostingLength = (unsigned*)malloc(sizeof(unsigned) * NumTerms);
  Term = (char**)malloc(sizeof(char*) * NumTerms);
  Term = (char**)malloc(sizeof(char*) * NumTerms);
  // Offset of each posting
  fread(PostingOffset, sizeof(unsigned), NumTerms, in);
  // Length of each posting in bytes
  fread(PostingLength, sizeof(unsigned), NumTerms, in);
  // Number of bytes in the posting terms array
  fread(&len, sizeof(unsigned), 1, in); 
  TermList = (char*)malloc(sizeof(char) * len);
  fread(TermList, sizeof(unsigned)*len, 1, in);

  unsigned k=1;
  Term[0] = &TermList[0];
  for (int i=1; i<len; i++) {
    if (TermList[i-1] == '\0') {
      Term[k] = &TermList[i];
      k++;
    }
  }
  fclose(in);
}

提前致谢。

最佳答案

我会给你一个良好的开端。

using(var reader = new BinaryReader(new FileStream(subindex, FileMode.Open)) {
    int numTerms = reader.ReadUInt32();
    postingOffset = new UInt32[numTerms];
    postingLength = new UInt32[numTerms];
    var term = new byte[numTerms];
    for(int i=0;i<numTerms;i++)
        postingOffset[i] = reader.ReadUInt32();
    for(int i=0;i<numTerms;i++)
        postingLength[i] = reader.ReadUInt32();
    var len = reader.ReadInt32();
    var termList = new ... // byte[] or uint32[] ??
    //etc
}

此处无需关闭文件句柄 - 当 using { } block 失去作用域时它将关闭。

我没有完成它,因为你的代码中有一些缺陷。使用TermList,您读取的数据量是您分配的数据量的 4 倍。您也不应该分配 Term 两次 - 这将导致内存泄漏。

要将 Term 转回字符串,请使用 Encoding.ASCII.GetString(term).TrimEnd('\0');

关于c# - 需要将 C++ 转换为 C# 的帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3286730/

相关文章:

c# - C# 中的正则表达式表现得很奇怪

c - 尝试加载链表时 Malloc 崩溃

python - PySide Qt tr() 不翻译,translate() 做 - 上下文错误?

c - ds_list 不能处理超过 3 个元素

c - gdb:是否可以根据调试符号中不存在的用户定义结构来转换/重新解释序列

C# 包装器类和来自 C++ 的 dllimport

html - 您如何处理带有标记的文本翻译?

c# - 单击另一个按钮无法获取组合框选择的项目值

c# - 如何在 C# 中的 switch case 中使用 web.config 值而不使用 if ,否则循环 "A constant value is expected."

c# - 查询以根据此多个条件从表中选择值列表