使用COCOS2D-X进行文件I / O.

时间:2012-08-29 05:31:42

标签: c++ xcode cocos2d-x

我正在尝试加载一个名为POSDATA.GAMEDATA的逗号分隔文件。我在互联网上查了几个地方,结果发现我需要做一些调整和/或不同的课程。

我尝试使用ifstream。但是,它无法打开文件。 Xcode 4.3.2似乎找不到我的POSDATA.GAMEDATA文件。我还尝试使用ofstream制作文件,但在两种情况下使用open()时,文件都没有打开。

我的代码是这样的:

using namespace std;
void FileLoader::loadFile( string p_WhichFile ) {
   // Local Variables
   string thisLine;

   // Open POSDATA.GAMEDATA
   ifstream dataStream;
   dataStream.open( p_WhichFile.c_str( ) );

   // Check if file is opened
   if ( !dataStream ) {
      cerr << "[ ERROR ] Cannot load file:" << p_WhichFile.c_str( ) << endl;
      exit( 1 );
   }

   // Get lines of strings
   while ( getline( dataStream, thisLine ) ) {
      fileContents.push_back( thisLine ); // fileContents is a vector< string > object
   }

   dataStream.close( );
   cout << "[ NOTICE ] Finished reading file" << p_WhichFile << endl;
}

我见过CCFileUtils,但似乎无法使用它。

编辑:我尝试过提供绝对路径(/Users/LanceGray/Documents/LanceDev/COCOS2DX/cocos2dx/TestGame/Data/POSDATA.GAMEDATA)并且有效。但是,我不能这样做,因为游戏应该在iOS设备和Android中使用,所以每个设备上的路径并不总是相同。任何帮助将非常感激。

3 个答案:

答案 0 :(得分:16)

我使用CCFileUtils( )::sharedFileUtils( ) -> fullPathFromRelativePath( "POSDATA.GAMEDATA" );

开始工作

更详细的解释:

  1. 转到左侧的项目树Right-click -> Add Files,添加项目中需要的文件。我所做的是在DataResources文件夹的同一级别添加了一个名为Classes的新文件夹,并将POSDATA.GAMEDATA文件放在那里。在Xcode中,我添加了一个新组,并在该组中添加了该文件。
  2. 然后我使用ifstream打开文件。
  3. 打开文件时,使用CCFileUtils( )::sharedFileUtils( ) -> fullPathFromRelativePath( )获取文件的绝对路径。提供fullPathFromRelativePath( )上的文件名作为参数。
  4. 尝试运行它,它应该可以正常工作。
  5. 一个小例子:

    // FileReader.h
    #include "cocos2d.h"
    
    using namespace std;
    using namespace cocos2d;
    
    class FileReader {
    private:
       vector< string > mFileContents;
    
    public:
       FileReader( string pFileName, char pMode = 'r' );
    };
    
    // FileReader.cpp
    #include "FileReader.h"
    #include <fstream>
    #include "cocos2d.h"
    
    using namespace cocos2d;
    using namespace std;
    
    FileReader::FileReader( string pFileName, char pMode ) {
       // Create input file stream
       ifstream inputStream;
       string thisLine;
    
       // Open file
       inputStream.open( CCFileUtils( )::sharedFileUtils( ) -> fullPathFromRelativePath( pFileName ).c_str( ) );
    
       // Check if it is open
       if ( !inputStream.is_open( ) ) {
          cerr << "[ ERROR ] Cannot open file: " << pFileName.c_str( ) << endl;
          exit( 1 );
       }
    
       while ( getline( inputStream, thisLine ) ) {
          // Put all lines in vector
          mFileContents.push_back( thisLine );
       }
    
       inputStream.close( );
       cout << "[ NOTICE ] Finished opening file: " << pFileName.c_str( ) << endl;
    }
    

    此类将加载名为pFileName的文件,并将其放在其成员变量mFileContents上。 (请注意,它应该有public get函数,例如vector< string > getFileContents( )来访问mFileContents,因为它是private

    编辑:以上示例适用于iOS,但不会在Android设备上运行。因此,要解决此问题,请使用ifstream而不是CCFileUtils::sharedUtils( ) -> getFileData( )。结合CCFileUtils::sharedUtils( ) -> fullPathFromRelativePath( ),我们将能够实现读取适用于iOS和Android的纯文本文件的目标。

    FileReader类将是这样的:

    // FileReader.cpp
    #include "FileReader.h"
    #include <fstream>
    #include "cocos2d.h"
    
    using namespace cocos2d;
    using namespace std;
    
    FileReader::FileReader( string pFileName, char pMode ) {
       // Initialize variables needed
       unsigned long fileSize = 0;
       unsigned char * fileContents = NULL;
       string thisLine, result, fullPath, contents;
    
       // Get absolute path of file
       fullPath = CCFileUtils::sharedFileUtils( ) -> fullPathFromRelativePath( pFileName.c_str( ) );
    
       // Get data of file
       fileContents = CCFileUtils::sharedFileUtils( ) -> getFileData( fullPath.c_str( ) , "r", &fileSize );
       contents.append( ( char * ) fileContents );
    
       // Create a string stream so that we can use getline( ) on it
       istringstream fileStringStream( contents );
    
       // Get file contents line by line
       while ( getline( fileStringStream, thisLine ) ) {
          // Put all lines in vector
          mFileContents.push_back( thisLine );
       }
    
       // After this, mFileContents will have an extra entry and will have the value '\x04'.
       // We should remove this by popping it out the vector.
       mFileContents.pop_back( );
    
       // Delete buffer created by fileContents. This part is required.
       if ( fileContents ) {
          delete[ ] fileContents;
          fileContents = NULL;
       }
    
       // For testing purposes
       cout << "[ NOTICE ] Finished opening file: " << pFileName.c_str( ) << endl;
    }
    

答案 1 :(得分:2)

// For versions less than v2.0.1
// The version I am using is 0.12.0
unsigned long fileSize = 0;
char* pBuffer = CCFileUltils::getFileData("relative_path","r",&fileSize);
CCLOG("Data is %s",pBuffer);

答案 2 :(得分:0)

您可以参考Cocos的wiki Read/write file in cocos2d