Win API

Тема в разделе "WASM.BEGINNERS", создана пользователем Mark, 30 дек 2011.

  1. Mark

    Mark Марк

    Публикаций:
    0
    AsmGuru62

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

    K10 New Member

    Публикаций:
    0
    Код (Text):
    1. BOOL ReadRandomWord(LPCTSTR lpFileName,
    2.                     LPCTSTR lpWord,
    3.                     LPDWORD nWordSize);
     
  3. steelfactor

    steelfactor New Member

    Публикаций:
    0
    K10
    Есть еще
    BOOL ReadRandomWordEx(LPCTSTR lpFileName,
    LPCTSTR lpWord,
    LPDWORD nWordSize,
    SECURITY_ATTRIBUTES sa );

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

    Sholar New Member

    Публикаций:
    0
    Читаешь файл целиком и функой strstr получаешь указатель на начало твоего слова.
     
  5. mix_mix

    mix_mix Михаил

    Публикаций:
    0
    Ужас, во что же превратился васм. Кругом мат, школота, не могущая осилить не то, что MSDN, так туториалы, любезно выложенные на сайте. Эх, где же времена MsRem'а, IceStudent'а?
     
  6. branvi

    branvi New Member

    Публикаций:
    0
    Раньше трава была зеленее, да?
     
  7. Mark

    Mark Марк

    Публикаций:
    0
    K10

    Правильно?

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

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

    Sholar New Member

    Публикаций:
    0
    Имхо ответы форумчан только вредят. Перестанут отвечать - пойдет наконец почитает книжечку.
     
  9. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Mark
    Нет такой функции: ReadRandomWord.
    Прикалываются господа WASM-еры.

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

    И затем идёшь по файлу используя функцию strtok() (посмотри её описание в MSDN).
    Примерный алгоритм:
    Код (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

    Публикаций:
    0
    Однако и тут есть небольшая, но существенная засада: возможна ситуация, когда длина слова больше размера буфера. И я не заметил, где в строку дописывается символ-терминатор.
     
  11. Mark

    Mark Марк

    Публикаций:
    0
    CyberManiac
    AsmGuru62

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

    Код (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 Марк

    Публикаций:
    0
  13. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Mark, Нет никакой ложкиникаких слов в файлах.
     
  14. Mark

    Mark Марк

    Публикаций:
    0
    Как выбрать случайную строку из файла?
     
  15. Mark

    Mark Марк

    Публикаций:
    0
    Прочитал: Нужно воспользоваться strtok. Объясните синтаксис? В гугле не понятно ((
     
  16. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Вторая ссылка гугла http://glagolew2010.narod.ru/14/strtok.htm
    Кроме того в студии штатная справка по стандартным функцям есть там тоже всё подробно и с примерами.
     
  17. Sholar

    Sholar New Member

    Публикаций:
    0
    Вызываешь fgets столько раз, скольно нужно.
     
  18. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Mark
    Тебе сейчас нужна строка или слово - это всё-таки разные вещи.
    strtok() вызывается первый раз с адресом начала буфера - перед началом цикла,
    а все последующие разы (внутри цикла) - NULL.

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

    Если нужна строка, то обычно разделители строк - это два символа:
    Код (Text):
    1. char* separator = "\r\n";
    Функция возвращает следующий элемент разделённый разделителями.
    Пример кода:
    Код (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 Марк

    Публикаций:
    0
    AsmGuru62

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

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

    Публикаций:
    90
    Марк :lol: Я думал тебе надор уже не отвечает. Ты учишь си си--?