Win API

Discussion in 'WASM.BEGINNERS' started by Mark, Dec 30, 2011.

  1. Mark

    Mark Марк

    Blog Posts:
    0
    Joined:
    Sep 15, 2011
    Messages:
    304
    AsmGuru62

    Вопрос: А как прочитать случайное слово из фала? Не целиком файл, а отдельное случайное слово? (Пользуюсь fread)
     
  2. K10

    K10 New Member

    Blog Posts:
    0
    Joined:
    Oct 3, 2008
    Messages:
    1,590
    Code (Text):
    1. BOOL ReadRandomWord(LPCTSTR lpFileName,
    2.                     LPCTSTR lpWord,
    3.                     LPDWORD nWordSize);
     
  3. steelfactor

    steelfactor New Member

    Blog Posts:
    0
    Joined:
    Apr 26, 2007
    Messages:
    501
    K10
    Есть еще
    BOOL ReadRandomWordEx(LPCTSTR lpFileName,
    LPCTSTR lpWord,
    LPDWORD nWordSize,
    SECURITY_ATTRIBUTES sa );

    Начиная с Win7 появилась =)
     
  4. Sholar

    Sholar New Member

    Blog Posts:
    0
    Joined:
    Oct 16, 2011
    Messages:
    189
    Читаешь файл целиком и функой strstr получаешь указатель на начало твоего слова.
     
  5. mix_mix

    mix_mix Михаил

    Blog Posts:
    0
    Joined:
    Oct 8, 2005
    Messages:
    277
    Location:
    Токио
    Ужас, во что же превратился васм. Кругом мат, школота, не могущая осилить не то, что MSDN, так туториалы, любезно выложенные на сайте. Эх, где же времена MsRem'а, IceStudent'а?
     
  6. branvi

    branvi New Member

    Blog Posts:
    0
    Joined:
    Jan 21, 2011
    Messages:
    40
    Раньше трава была зеленее, да?
     
  7. Mark

    Mark Марк

    Blog Posts:
    0
    Joined:
    Sep 15, 2011
    Messages:
    304
    K10

    Правильно?

    Code (Text):
    1. ReadRandomWord(Имя_файла,
    2.                                                     LPCTSTR lpWord,
    3.                                                     Размер);
    Вот только это

    Code (Text):
    1.  LPCTSTR lpWord
    Что за параметр?
     
  8. Sholar

    Sholar New Member

    Blog Posts:
    0
    Joined:
    Oct 16, 2011
    Messages:
    189
    Имхо ответы форумчан только вредят. Перестанут отвечать - пойдет наконец почитает книжечку.
     
  9. AsmGuru62

    AsmGuru62 Member

    Blog Posts:
    0
    Joined:
    Sep 12, 2002
    Messages:
    689
    Location:
    Toronto
    Mark
    Нет такой функции: ReadRandomWord.
    Прикалываются господа WASM-еры.

    Более подробно объясни проблему: что значит случайное слово?
    Если у тебя есть текстовый файл в котором допустим 1000 слов и тебе
    надо например 257-е слово и все слова разной длины, то надо читать файл
    целиком если он не слишком велик или по кускам, если он более сотни Мб в размере.

    И затем идёшь по файлу используя функцию strtok() (посмотри её описание в MSDN).
    Примерный алгоритм:
    Code (Text):
    1. FILE*   file = fopen ("C:\\TEMP\\YourFile.txt", "rb");
    2. PCHAR   LoadedText = (PCHAR) calloc (1, 0x20000); // <-- 128Kb memory block filled by zeroes
    3. PCHAR   pszWord;
    4. PCHAR   separators = " ,-+.\r\n"; <-- characters, which separate words in a file
    5. UINT    countWords = 0;
    6.  
    7. fread (LoadedText, 0x20000, 1, file);
    8. fclose (file);
    9.  
    10. pszWord = strtok (LoadedText, separators);
    11. while (pszWord)
    12. {
    13.     ++countWords;
    14.     if (countWords == 257)
    15.     {
    16.         //
    17.         // 'pszWord' now points to the 257s word in a file.
    18.         //
    19.         break;
    20.     }
    21.     pszWord = strtok (NULL, separators);
    22. }
    23.  
    24. free (LoadedText);
    Если в файле более чем 128 Кб - естественно, надо выделить больше памяти в вызове calloc().
    Более универсально было бы узнать размер файла через fseek() на конец файла. Естественно,
    после этого (перед чтением) надо вызвать fseek() снова, чтобы попасть назад на начало файла.
     
  10. CyberManiac

    CyberManiac New Member

    Blog Posts:
    0
    Joined:
    Sep 2, 2003
    Messages:
    2,473
    Location:
    Russia
    Однако и тут есть небольшая, но существенная засада: возможна ситуация, когда длина слова больше размера буфера. И я не заметил, где в строку дописывается символ-терминатор.
     
  11. Mark

    Mark Марк

    Blog Posts:
    0
    Joined:
    Sep 15, 2011
    Messages:
    304
    CyberManiac
    AsmGuru62

    Т. е примерно так (?):

    Code (Text):
    1. char s[] = "1.txt";
    2.              
    3.              FILE *fos;
    4.              fos = fopen(s, "rwb+");
    5.              
    6.              char files[10000];
    7.    
    8.              for(int hlg = 0; hlg<10000; hlg++)
    9.              {
    10.                      files[hlg] = '\0';
    11.              }
    12.    
    13.              char j[] = "|";
    14.    
    15.              fread(files, sizeof(files),1,fos);
    16.              
    17.              char *op = strtok(
    18.                           files,
    19.                           j
    20.                          );
    21.                          
    22. fclose(fos);             
    23. SetWindowText(hWnd, s);
     
  12. Mark

    Mark Марк

    Blog Posts:
    0
    Joined:
    Sep 15, 2011
    Messages:
    304
  13. Dmitry_Milk

    Dmitry_Milk Member

    Blog Posts:
    0
    Joined:
    Nov 20, 2007
    Messages:
    540
    Mark, Нет никакой ложкиникаких слов в файлах.
     
  14. Mark

    Mark Марк

    Blog Posts:
    0
    Joined:
    Sep 15, 2011
    Messages:
    304
    Как выбрать случайную строку из файла?
     
  15. Mark

    Mark Марк

    Blog Posts:
    0
    Joined:
    Sep 15, 2011
    Messages:
    304
    Прочитал: Нужно воспользоваться strtok. Объясните синтаксис? В гугле не понятно ((
     
  16. Y_Mur

    Y_Mur Active Member

    Blog Posts:
    0
    Joined:
    Sep 6, 2006
    Messages:
    2,494
    Вторая ссылка гугла http://glagolew2010.narod.ru/14/strtok.htm
    Кроме того в студии штатная справка по стандартным функцям есть там тоже всё подробно и с примерами.
     
  17. Sholar

    Sholar New Member

    Blog Posts:
    0
    Joined:
    Oct 16, 2011
    Messages:
    189
    Вызываешь fgets столько раз, скольно нужно.
     
  18. AsmGuru62

    AsmGuru62 Member

    Blog Posts:
    0
    Joined:
    Sep 12, 2002
    Messages:
    689
    Location:
    Toronto
    Mark
    Тебе сейчас нужна строка или слово - это всё-таки разные вещи.
    strtok() вызывается первый раз с адресом начала буфера - перед началом цикла,
    а все последующие разы (внутри цикла) - NULL.

    Ты отладчиком снова не пользуешься?
    Тот код, кстати (пост #269) - работает полностью (имя файла только своё поставь) - пройдись
    по коду отладчиком и всё станет понятно.
    Чистить буфер нулями не надо - используй функцию calloc().

    Если нужна строка, то обычно разделители строк - это два символа:
    Code (Text):
    1. char* separator = "\r\n";
    Функция возвращает следующий элемент разделённый разделителями.
    Пример кода:
    Code (Text):
    1. char    buf [128];
    2. char*   separators = " -<>.";
    3. char*   op;
    4.  
    5. strcpy (buf, "  This   is     -a-   <long>   text.");
    6.  
    7. op = strtok (buf, separators);  <-- op = "This"
    8. op = strtok (NULL, separators); <-- op = "is"
    9. op = strtok (NULL, separators); <-- op = "a"
    10. op = strtok (NULL, separators); <-- op = "long"
    11. op = strtok (NULL, separators); <-- op = "text"
    12. op = strtok (NULL, separators); <-- op = NULL (buffer ended)
    Вот это ^^^^^^^ - работающий код - иди отладчиком.
     
  19. Mark

    Mark Марк

    Blog Posts:
    0
    Joined:
    Sep 15, 2011
    Messages:
    304
    AsmGuru62

    А что возвращает strtok когда идет разделитель?
     
  20. yashechka

    yashechka Ростовский фанат Нарвахи

    Blog Posts:
    90
    Joined:
    Jan 2, 2012
    Messages:
    1,449
    Location:
    Россия
    Марк :lol: Я думал тебе надор уже не отвечает. Ты учишь си си--?