我正在研究一些多平台 C++ 代码。因此需要使用 fopen、fgetpos 等。以下内容较早在 iOS 上运行,并且随着我更新到最新版本,它停止运行。
我在 Shaders 文件夹中有几个文本文件 Shader.vsh 和 Shader.fsh,它们被复制到包中。为了打开文件,我执行以下操作..
CFBundleRef mainBundle = CFBundleGetMainBundle();
CFStringRef cfstrFilename = CFSTRFromConstCharPtr( "Shader" );
CFStringRef cfstrFileType = CFSTRFromConstCharPtr( "vsh" );
CFStringRef cfstrSubDir = CFSTRFromConstCharPtr( "Shaders" );
CFURLRef resourcesURL = CFBundleCopyResourceURL( mainBundle, cfstrFilename, cfstrFileType, cfstrSubDir );
CFStringRef str = CFURLCopyFileSystemPath( resourcesURL, kCFURLPOSIXPathStyle );
CFRelease( resourcesURL );
char path[ PATH_MAX ];
CFStringGetCString( str, path, FILENAME_MAX, kCFStringEncodingASCII );
CFRelease( str );
FILE* fp = fopen( path, "rb" );
此时,fp 为非 NULL。所以我认为它成功了。后来,当我尝试做
fpos_t pos;
int result = fgetpos( fp, &fpos_t );
结果 = -1 和 errno = 0x2,我认为这是找不到文件。
正如我之前提到的,这曾经在某个时候在以前的版本上工作。我再次开始处理这个问题,并在此过程中更新到最新的 XCode 等,然后事情就停止了。
我传递给 fopen 的文件路径原来是 /Users/shammi/Library/Application Support/iPhone Simulator/6.1/Applications/9132490F-71AC-4C61-A584-E8F6C5B261FF/TestApp.app/Shaders/Shader.vsh我能够在 finder/console 中查看并打开该文件并确认其有效。
我究竟做错了什么?是否有另一种选择可以让我使用便携式 IO 功能?