Win API

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

  1. Mark

    Mark Марк

    Публикаций:
    0
    Регистрация:
    15 сен 2011
    Сообщения:
    304
    AsmGuru62

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

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    Код (Text):
    1. BOOL ReadRandomWord(LPCTSTR lpFileName,
    2.                     LPCTSTR lpWord,
    3.                     LPDWORD nWordSize);
     
  3. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    K10
    Есть еще
    BOOL ReadRandomWordEx(LPCTSTR lpFileName,
    LPCTSTR lpWord,
    LPDWORD nWordSize,
    SECURITY_ATTRIBUTES sa );

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

    Sholar New Member

    Публикаций:
    0
    Регистрация:
    16 окт 2011
    Сообщения:
    189
    Читаешь файл целиком и функой strstr получаешь указатель на начало твоего слова.
     
  5. mix_mix

    mix_mix Михаил

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

    branvi New Member

    Публикаций:
    0
    Регистрация:
    21 янв 2011
    Сообщения:
    40
    Раньше трава была зеленее, да?
     
  7. Mark

    Mark Марк

    Публикаций:
    0
    Регистрация:
    15 сен 2011
    Сообщения:
    304
    K10

    Правильно?

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

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

    Sholar New Member

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

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    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
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    Однако и тут есть небольшая, но существенная засада: возможна ситуация, когда длина слова больше размера буфера. И я не заметил, где в строку дописывается символ-терминатор.
     
  11. Mark

    Mark Марк

    Публикаций:
    0
    Регистрация:
    15 сен 2011
    Сообщения:
    304
    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
    Регистрация:
    15 сен 2011
    Сообщения:
    304
  13. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    540
    Mark, Нет никакой ложкиникаких слов в файлах.
     
  14. Mark

    Mark Марк

    Публикаций:
    0
    Регистрация:
    15 сен 2011
    Сообщения:
    304
    Как выбрать случайную строку из файла?
     
  15. Mark

    Mark Марк

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

    Y_Mur Active Member

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

    Sholar New Member

    Публикаций:
    0
    Регистрация:
    16 окт 2011
    Сообщения:
    189
    Вызываешь fgets столько раз, скольно нужно.
     
  18. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    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
    Регистрация:
    15 сен 2011
    Сообщения:
    304
    AsmGuru62

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

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

    Публикаций:
    90
    Регистрация:
    2 янв 2012
    Сообщения:
    1.449
    Адрес:
    Россия
    Марк :lol: Я думал тебе надор уже не отвечает. Ты учишь си си--?