Macos 用stdio.h函数替换Carbon文件函数
我正在尝试转换一段旧代码,其中包含过时的Carbon函数FSWrite、FSRead等。我们要尝试的一个实验是用它们的POSIX等价物替换它们,即stdio.h中定义的函数,例如用fread()替换FSRead()。但我不确定如何处理碳函数的第一个arg: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
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仍然建立在碳的基础上,那有什么意义呢
脚注
#定义(文件)偏移量(位64)
左右以获得更大的文件支持,这很容易忘记。遗憾的是,要做到这一点并不容易顺便说一句,如果这种努力是愚蠢的,那没关系;我们怀疑这整件事需要更深入的重写。你所说的fopen()、fread()等是否与open()、read()等相同?当然不是;一组接受
文件*
,另一组接受int
。它们是否和Carbon调用兼容是任何人的猜测(取决于Carbon在OSX上的实现方式,它们可能是),但我真的不会在生产代码中依赖它。