Чтение файла

Тема в разделе "Программирование / Скриптинг", создана пользователем inklesspen, 26 авг 2016.

  1. inklesspen

    inklesspen После "Р" в слове "Лопата"

    Сообщения:
    830
    Симпатии:
    195
    Я хочу прочитать файл .phy, там KeyValues и не только, я пытался его прочти, юзая KeyValues, но не выходит, хочу прочесть его просто как обычный файл...
    Мне нужно найти ключ "modelname", а я вот хз как...
    --- Добавлено позже ---
    Вот мой код, который выдает это
    upload_2016-8-26_22-2-42.png

    PHP:
    new Handle:file OpenFile(arg"r")
        if(
    file==INVALID_HANDLE)
        {
            
    PrintToChat(client"Invalid file")
            return;
        }
        
    decl String:line[PLATFORM_MAX_PATH];
        while(!
    IsEndOfFile(file))
        {
            
    ReadFileLine(file,line,sizeof(line));
            new 
    pos;
            
    pos StrContains((line), "\"surfaceprop\"")+12;
            if(
    pos!=-1)
            {
                for(new 
    pos;i<sizeof(line);i++)
                {
                    if(
    line[i]=='\"')
                    {
                        
    decl String:key[64]
                        new 
    pos2 0
                        
    for(new i+1;l<sizeof(line);l++)
                        {
                            if(
    line[l]=='\"')
                            {
                                
    PrintToChat(client"Line: %s"line)
                                
    PrintToChat(client"Value: %s"key)
                                return;
                            }
                            
    key[pos2]=line[l]
                            
    pos2++
                            
    // PrintToConsole(client, line[l])
                        
    }
                        
    PrintToChat(client"NotFoundValue")
                    }
                }
            }
        }
        
    PrintToChat(client"null")
    [/
    spoiler]
     
    Последнее редактирование: 26 авг 2016
  2. m22b

    m22b Read Only

    Сообщения:
    1.022
    Симпатии:
    209
    Tesloz нравится это.
  3. inklesspen

    inklesspen После "Р" в слове "Лопата"

    Сообщения:
    830
    Симпатии:
    195
    Это и есть этот раздел, просто я думал ты знаешь... Ну ок
     
  4. gibs

    gibs Фитиль народного волненья

    Сообщения:
    536
    Симпатии:
    133
    Это бинарный файл, а не текстовый.
    Но вообще, нормальный человек бы загуглил формат файла и написал бы парсер для него.
    Поскольку ты пытаешься учиться не шевеля мозгами, то я тебе немножко разжую.
    Тут описан формат файла.
    Указано, что файл начинается с заголовка, в котором указан размер заголовка, а так же solidCount, которая определяет количество compactsurfaceheader_t, каждый из которого начинается с указания своего размера, и которые следуют после заголовка. И документ заканчивается текстовой секцией, которая тебе и нужна.
    В идеале ты должен проскакать всю бинарную часть циклом, а затем скопировать текстовую секцию в строку.
    Ну и, разумеется, следует открывать файл в бинарном режиме.
     
  5. inklesspen

    inklesspen После "Р" в слове "Лопата"

    Сообщения:
    830
    Симпатии:
    195
    Я не думаю, что эта часть бинарная....
    upload_2016-8-27_13-48-1.png
     
  6. gibs

    gibs Фитиль народного волненья

    Сообщения:
    536
    Симпатии:
    133
    Ну да, даже не знаю почему я назвал её текстовой секцией.
     
  7. inklesspen

    inklesspen После "Р" в слове "Лопата"

    Сообщения:
    830
    Симпатии:
    195
    Ааа:D Понял...
    Но как автоматом пропустить бинарную часть то?
     
  8. gibs

    gibs Фитиль народного волненья

    Сообщения:
    536
    Симпатии:
    133
    @inklesspen, я немного удивляюсь, я тебе ведь разжевал.
    PHP:
    bool GetPhyTextData(const char[] szFilechar[] szBufferint maxlen)
    {
        
    File file OpenFile(szFile"rb");
        if(
    file == null)
            return 
    false;
      
        
    int sizesolidCount;
        
    file.ReadInt32(size);
        
    file.Seek(8SEEK_SET);
        
    file.ReadInt32(solidCount);
        
    file.Seek(sizeSEEK_SET);
      
        for (
    int i 0dummysolidCounti++)
        {
            
    file.ReadInt32(dummy);
            
    file.Seek(dummySEEK_CUR);
        }
      
        
    file.ReadString(szBuffermaxlen);
      
        
    delete file;
        return 
    true;
    }
    Вот тебе функция, которая вытягивает из .phy файла szFile текстовую секцию в строку szBuffer. Только что написал и проверил.