Работа со списком.

Тема в разделе "FASM", создана пользователем HPC, 2 мар 2012.

  1. HPC

    HPC New Member

    Публикаций:
    0
    Регистрация:
    30 мар 2011
    Сообщения:
    37
    Всем привет.
    Задача такая:
    Есть обычный фаил .txt ,в нем есть список строк

    пример:
    Код (Text):
    1. строка1
    2. строка2
    3. строка3
    4. строка4
    Вопрос как проще а главное быстрее получить эти строки по порядку?

    Подскажите алгоритм.Начинаю с функции CreateFile- открываю фаил что делать дальше?
     
  2. Fedor666

    Fedor666 Fedor

    Публикаций:
    0
    Регистрация:
    27 май 2009
    Сообщения:
    30
    Адрес:
    М.О., г.Королев
    ReadFile в буфер и разбор строк поиском кода 13 (перевод строки).
     
  3. HPC

    HPC New Member

    Публикаций:
    0
    Регистрация:
    30 мар 2011
    Сообщения:
    37
    Понятно.
    А если фаил большой и не известно какого размера нужен будет буфер для него.
    Правильно ли будет сделать так-как я сделал в коде ниже?

    Код (Text):
    1.  invoke  CreateFileA,pFile,GENERIC_READ+GENERIC_WRITE,FILE_SHARE_READ+FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0
    2.  
    3.    MOV     [hFile],EAX
    4.  
    5.    invoke  GetFileSize,[hFile],NULL
    6.  
    7.    MOV     [filesize],EAX
    8.  
    9.    invoke  VirtualAlloc,NULL,[filesize],MEM_COMMIT,PAGE_READWRITE
    10.  
    11.    MOV     [ptrvbase],EAX
    12.  
    13.    invoke  ReadFile,[hFile],[ptrvbase],[filesize],lpBytesRead, 0
     
  4. VaZoNeZ

    VaZoNeZ New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2009
    Сообщения:
    121
    Если файл будет БОЛЬШОЙ, то выделение памяти зафейлится. Выберите себе буфер определенного размера (1mb к примеру) и по кускам читайте файл.
     
  5. kernel16

    kernel16 Human Vl

    Публикаций:
    0
    Регистрация:
    29 окт 2010
    Сообщения:
    316
    char WordBuffer[500];

    int wordOffset = 0;
    bool GetWord(HANDLE hFile)
    {
    int Entering = 0;
    wordOffset = 0;
    DWORD ReadRes;
    while(true)
    {
    ReadFile(hFile,&WordBuffer[wordOffset],1,&ReadRes,0);
    if(ReadRes == 0)
    {
    WordBuffer[wordOffset] = 0;
    if(wordOffset == 0) return false;
    return true;
    }
    if(WordBuffer[wordOffset] == 0xD || WordBuffer[wordOffset] == 0xA)
    {
    Entering++;
    if(Entering == 2)
    {
    WordBuffer[wordOffset] = 0;
    return true;
    }
    wordOffset--;
    }
    wordOffset++;
    }
    WordBuffer[wordOffset] = 0;
    if(wordOffset == 0) return false;
    return true;
    }

    мой старый код на с++, принимает хендл файла с файл поинтером на 0й байт, потом вызывается в цикле. есть секьюрити недостаток при обработки новой строки, но для нормальных txt файлов должен работать нормально.(я когда-то на нём брут форс делал)... и недостаток в низкой скорости чтения, надо приляпать какой-то буффераризатор