【问题标题】:Problems with File I/o when porting old 'C' libraries from 32-bit to 64-bit将旧的“C”库从 32 位移植到 64 位时的文件 I/o 问题
【发布时间】:2011-01-20 18:40:31
【问题描述】:

我有非常古老的“c”代码,它使用 read 来读取二进制文件。这是一个示例:

uint MyReadFunc(int _FileHandle, char *DstBuf, uint BufLen)
{  
    return (read( _FileHandle, DstBuf, BufLen));
}

对于 64 位操作系统 - char * 将为 64 位,但 BufLen 仅为 32 位,返回值仅为 32 位。

将其更改为 .NET 不是一个选项 - 我有 .NET 版本,但我也需要转换这个旧库。

谁能告诉我在 64 位操作系统上执行 File i/o 需要什么(使用“C”代码)

【问题讨论】:

  • 不同的尺寸是否会导致问题?因为我看不出他们有什么理由。
  • 您遇到什么样的错误?

标签: c file-io 32bit-64bit


【解决方案1】:

使用size_t,而不是uint

【讨论】:

  • 你的意思是ssize_t,因为read可以返回-1。假设 POSIX read 当然。
  • 是的,返回类型应该是ssize_t。我错过了。我的意思是BufLen 应该是size_t
  • 我使用的是 Windows Vista、Visual Studio 2005 - 读取的原型是: int read(int fileHandle, void * buffer, unsigned int buffSize) 不是 size_t - 我同意它“应该”是 size_t,但事实并非如此。
【解决方案2】:

您似乎将两件事混为一谈:指针的大小和它指向的内存范围。

【讨论】:

    【解决方案3】:

    我不确定 char* 是否为 64 位 - 指针本身将是 64 位,是的,但实际值仍然是字符数组,除非我遗漏了什么? (我不是一个出色的 C 程序员。)

    read() 的长度参数是 size_t,而不是 int,在 64 位系统上应该是 64 位而不是 32。返回值也是 ssize_t,而不是 int,它也是 64 位的如果您只是将函数定义更改为返回 ssize_t,并采用 size_t 而不是 ints,则应该涵盖您。

    【讨论】:

    • 我使用的是 Windows Vista、Visual Studio 2005 - 读取的原型是: int read(int fileHandle, void * buffer, unsigned int buffSize) 不是 size_t - 我同意它“应该”是 size_t,但事实并非如此。
    猜你喜欢
    • 1970-01-01
    • 2020-10-28
    • 2014-12-05
    • 2015-06-16
    • 1970-01-01
    • 2011-01-24
    • 2011-04-03
    • 2011-01-31
    • 2011-04-01
    相关资源
    最近更新 更多