2013-06-22 1 views
0

일부 멀티 플랫폼 C++ 코드에서 작업 중입니다. 따라서 fopen, fgetpos 등을 사용하기위한 요구 사항은 다음과 같습니다. iOS의 초기 버전이었고 최신 버전으로의 업데이트가 중단되었습니다.번들의 파일을 열 때 iOS 6.1 시뮬레이터에서 fgetpos가 실패합니다.

Shader 폴더에 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 파인더/콘솔에서 해당 파일을보고 열 수 있으며 유효한 지 확인했습니다.

내가 뭘 잘못하고 있니? 휴대용 IO 기능을 사용할 수있는 또 다른 방법이 있습니까?

+0

파일 접근 권한으로 인해 문제가 발생할 수 있습니다. 누구든지 XCode 또는 시뮬레이터 권한에 대한 특정 요구 사항이 있는지 알고 있습니까? – Shammi

답변

0

발견. 여기서 언급하지 못한 것은 위 코드의 두 섹션 사이에서 일어나는 일입니다. 이것 이전에는 필자는 자신의 ref 카운팅 솔루션을 사용했고 최근에는 shared_ptr을 사용하도록 변경했습니다. 내 자신의 참조 계산 솔루션은 암시 적 캐스트를 허용했습니다. shared_ptr을 사용하면 그렇게 할 수 없습니다. 그래서 여기에 정확한 코드 ...

표준 : : 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));` 

또한, perror()를 사용하면 errno를 해독하려는 것과 비교하여 더 유용하다는 것이 입증되었습니다.

+0

수정 사항과 함께 여기에 너무 빨리 말씀하십시오. 문제는 소멸자가 호출되고 있다는 것입니다. 그러나이 작업도 ... 자동 pFileStream = std :: make_shared (fp, _eMode); 파일 스트림 소멸자를 호출하고 이것이 새로 생성 된 개체인지 확인했습니다. – Shammi

관련 문제