Work with filestrings read by BaseFile



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 01/12/2005 at 06:03, xxxxxxxx wrote:

    User Information:
    Cinema 4D Version:   7 XL 
    Platform:   Windows  ;   
    Language(s) :   C.O.F.F.E.E  ;

    ---------
    Hello out there,
    I am quite new on coding C.O.F.F.E.E. To start my lessions on filescripting, I am coding a menuplugin to import OBJ-files.
    Unfortunately C.O.F.F.E.E, thus plattform independent, is horrible slow (I think because it is an interpreter, although compiling did not make it faster).
    Here is the way the file is read:
    I read the file into a long string with BaseFile->Readstring. Then I am trying to splitt this string linewise and access data in the line.
    Therefore I am searching CRLF-signs in te string with the strstr-function. I got some tipps from other users, that this function is very slow. (Hello Maxon: Is it like this and if, why?)
    Does anybody have a tuning-trick to speed up string-operations like these in C.O.F.F.E.E., perhaps using other functions than strstr/strchr?
    Or does anybody have a tipp for me, how reading a file could be done quicker?
    As I am not very familiar with VC++ and because it would no longer be plattform-idependent I would prefer not to recode in C++-SDK (even if it runs much faster then).
    Thanks for help everybody,
    COFFEJUNKIE
    Ps: Sorry for my English, I did not speak or write it for longer now...



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 10/12/2005 at 04:57, xxxxxxxx wrote:

    I don't know about the performance, but this is a function that I have used to extract a line in C.O.F.F.E.E.:

        
        
        // Remove a line from data and return it  
        // Must be called by reference: getline(&data)  
        getline(data)  
        {  
          var pos = strstr(data, "\n");  
          var line = strmid(data, 0, pos-1);  
          data = strmid(data, pos+1, sizeof(data));  
          return line;  
        }
    

    This is an example of how it's used:

        
        
        main()  
        {  
          // Open file for reading  
          var f = new(BaseFile);  
          f->Open(file);
        
        
        
        
          // Read the whole file  
          var data = f->ReadString(f->GetLength());  
             
          // Read the number of objects  
          var max_index = evaluate(getline(&data));  
            
          // Loop through objects  
          var i;  
          for (i = 0; i < max_index; ++i)  
          {  
            var obj = getline(&data);  
            if (i == index)  
            {  
              // Output the name of obj number 'index'  
              name = obj;  
            }  
          }  
          ...  
        }
    


  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 16/12/2005 at 06:48, xxxxxxxx wrote:

    Hello Mikael,
     
    first of all, thanks for your answer. There is only one question I have and do not understand in your code:
    Your code to remove the extracted line from the datastring is
    data = strmid(data, pos+1, sizeof(data));

    but I think you have to reduce sizeof(data) by the amount of removed characters like
    data = strmid(data, pos+1, sizeof(data)-pos);
    or is this wrong? And if so, why (perhaps because of possible unicode?)
    Best greetings,
    COFFEJUNKIE



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 17/12/2005 at 10:27, xxxxxxxx wrote:

    That's just me being lazy. The docs said that strmid ignored the size going beyond the length of the string, so I didn't bother thinking of what to subtract (pos, pos+1 or pos-1). Your version is better, at least if you've chosen the right amount to subtract... :-)


Log in to reply