gpt4 book ai didi

c - 打开 bundle 中的文件时,fgetpos 在 iOS 6.1 模拟器中失败

转载 作者:行者123 更新时间:2023-11-30 17:50:29 27 4
gpt4 key购买 nike

我正在编写一些多平台 C++ 代码。因此需要使用 fopen、fgetpos 等。以下内容早些时候在 iOS 上运行,但随着我更新到最新版本,它停止运行。

我的 Shaders 文件夹中有几个文本文件 Shader.vsh 和 Shader.fsh,它们将被复制到 bundle 中。为了打开文件,我执行以下操作..

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为Non NULL。所以我认为它成功了。后来,当我尝试这样做时

fpos_t pos;
int result = fgetpos( fp, &fpos_t );

result = -1 和 errno = 0x2,我认为这是找不到文件。

正如我之前提到的,这曾经在某个时候适用于以前的版本。我再次开始研究这个问题,并在此过程中更新到最新的 XCode 等,但事情停止了。

我传递到 fopen 的文件的路径是/Users/shammi/Library/Application Support/iPhone Simulator/6.1/Applications/9132490F-71AC-4C61-A584-E8F6C5B261FF/TestApp.app/Shaders/着色器.vsh我可以在查找器/控制台中查看并打开该文件并确认其有效。

我做错了什么?是否有另一种选择可以让我使用可移植 IO 功能?

最佳答案

发现问题了。我在这里没有提及的是上面两段代码之间发生的情况。在此之前,我曾经有自己的引用计数解决方案,最近我改为使用shared_ptr。我自己的引用计数解决方案允许隐式转换。对于shared_ptr,你不能这样做。所以这是确切的代码...

std::shared_ptr< BinaryStream > BundleNamespace::OpenStream( const char* _szPath,

BinaryStream::Mode _eMode )
{
std::shared_ptr< BinaryStream > pStream = __super::OpenStream( _szPath, _eMode );
if ( !pStream )
{
std::string strDir;
std::string strFile;
std::string strExt;

SplitPath( _szPath, strDir, strFile, strExt );

std::string strFullPath = GetResourcePathFor( strFile.c_str(), strExt.c_str(), strDir.c_str() );

FILE* fp = fopen( strFullPath.c_str(), _eMode == BinaryStream::Mode_Read ? "r" : "w+b" );

pStream = std::make_shared<FileStream>( fp, _eMode );
}

return pStream;
}

这里的问题是

    pStream = std::make_shared<FileStream>( fp, _eMode );

我的 FileStream 的析构函数调用 fclose(m_pFile)。这里的解决方法是将其更改为..

    pStream = std::static_pointer_cast< BinaryStream >( std::make_shared<FileStream>( fp, _eMode ) );`

此外,事实证明,与尝试破译 errno 相比,使用 perror() 更有用。

关于c - 打开 bundle 中的文件时,fgetpos 在 iOS 6.1 模拟器中失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17254596/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com