Macos 用stdio.h函数替换Carbon文件函数

Macos 用stdio.h函数替换Carbon文件函数,macos,macos-carbon,stdio,Macos,Macos Carbon,Stdio,我正在尝试转换一段旧代码,其中包含过时的Carbon函数FSWrite、FSRead等。我们要尝试的一个实验是用它们的POSIX等价物替换它们,即stdio.h中定义的函数,例如用fread()替换FSRead()。但我不确定如何处理碳函数的第一个arg: SetFPos(gFormatRecord->dataFork, fsFromStart, 0); gFormatRecord是指向FormatRecord的指针。dataFork只是一个普通的常规unixy文件句柄,适合放入frea

我正在尝试转换一段旧代码,其中包含过时的Carbon函数FSWrite、FSRead等。我们要尝试的一个实验是用它们的POSIX等价物替换它们,即stdio.h中定义的函数,例如用fread()替换FSRead()。但我不确定如何处理碳函数的第一个arg:

SetFPos(gFormatRecord->dataFork, fsFromStart, 0);
gFormatRecord是指向FormatRecord的指针。dataFork只是一个普通的常规unixy文件句柄,适合放入fread()、fprintf()等等吗?(无论如何,我对文件“forks”了解不多。)


(这是我先前问题的后续内容,)

gFormatRecord->dataFork
,听起来你好像在尝试编写Photoshop插件。那可不行

Photoshop(大概是大多数Mac Adobe软件)充满了大量的碳代码,其设计与现有的8.5 API基本相同,同时也与OS X兼容API/ABI(我不知道CFM碳支持是否/何时取消)

根据文档,您应该使用FSSetForkPosition(),这可能最终是同一个函数调用。你几乎肯定不能使用
fseek()
/
fsetpos()
/
fseeko()
,它需要一个
文件*
,而根据我的标题,碳文件句柄似乎是SInt16(网络文档说它是一个FSIORefNum)。[1]

还要注意,
fopen()
和朋友不是POSIX;它们是标准的C。POSIX函数通常是相同的,没有前导f,除了seek是
lseek()
。[2] POSIX“文件句柄”是一个文件描述符,它只是一个
int

现在,如果您非常幸运,FSIORefNum将只是一个文件描述符,您可以将它传递给
read()
/
write()
/
lseek()
。但这最终没有什么好处;如果Photoshop仍然建立在碳的基础上,那有什么意义呢


脚注

  • fseek()特例指向零页并非不可能,但我认为它们不会因此而污染libc。)
  • 在Linux/x86上,您需要
    #定义(文件)偏移量(位64)
    左右以获得更大的文件支持,这很容易忘记。遗憾的是,要做到这一点并不容易

  • 顺便说一句,如果这种努力是愚蠢的,那没关系;我们怀疑这整件事需要更深入的重写。你所说的fopen()、fread()等是否与open()、read()等相同?当然不是;一组接受
    文件*
    ,另一组接受
    int
    。它们是否和Carbon调用兼容是任何人的猜测(取决于Carbon在OSX上的实现方式,它们可能是),但我真的不会在生产代码中依赖它。