AsmGuru62 Вопрос: А как прочитать случайное слово из фала? Не целиком файл, а отдельное случайное слово? (Пользуюсь fread)
K10 Есть еще BOOL ReadRandomWordEx(LPCTSTR lpFileName, LPCTSTR lpWord, LPDWORD nWordSize, SECURITY_ATTRIBUTES sa ); Начиная с Win7 появилась =)
Ужас, во что же превратился васм. Кругом мат, школота, не могущая осилить не то, что MSDN, так туториалы, любезно выложенные на сайте. Эх, где же времена MsRem'а, IceStudent'а?
K10 Правильно? Код (Text): ReadRandomWord(Имя_файла, LPCTSTR lpWord, Размер); Вот только это Код (Text): LPCTSTR lpWord Что за параметр?
Mark Нет такой функции: ReadRandomWord. Прикалываются господа WASM-еры. Более подробно объясни проблему: что значит случайное слово? Если у тебя есть текстовый файл в котором допустим 1000 слов и тебе надо например 257-е слово и все слова разной длины, то надо читать файл целиком если он не слишком велик или по кускам, если он более сотни Мб в размере. И затем идёшь по файлу используя функцию strtok() (посмотри её описание в MSDN). Примерный алгоритм: Код (Text): FILE* file = fopen ("C:\\TEMP\\YourFile.txt", "rb"); PCHAR LoadedText = (PCHAR) calloc (1, 0x20000); // <-- 128Kb memory block filled by zeroes PCHAR pszWord; PCHAR separators = " ,-+.\r\n"; <-- characters, which separate words in a file UINT countWords = 0; fread (LoadedText, 0x20000, 1, file); fclose (file); pszWord = strtok (LoadedText, separators); while (pszWord) { ++countWords; if (countWords == 257) { // // 'pszWord' now points to the 257s word in a file. // break; } pszWord = strtok (NULL, separators); } free (LoadedText); Если в файле более чем 128 Кб - естественно, надо выделить больше памяти в вызове calloc(). Более универсально было бы узнать размер файла через fseek() на конец файла. Естественно, после этого (перед чтением) надо вызвать fseek() снова, чтобы попасть назад на начало файла.
Однако и тут есть небольшая, но существенная засада: возможна ситуация, когда длина слова больше размера буфера. И я не заметил, где в строку дописывается символ-терминатор.
CyberManiac AsmGuru62 Т. е примерно так (?): Код (Text): char s[] = "1.txt"; FILE *fos; fos = fopen(s, "rwb+"); char files[10000]; for(int hlg = 0; hlg<10000; hlg++) { files[hlg] = '\0'; } char j[] = "|"; fread(files, sizeof(files),1,fos); char *op = strtok( files, j ); fclose(fos); SetWindowText(hWnd, s);
Вторая ссылка гугла http://glagolew2010.narod.ru/14/strtok.htm Кроме того в студии штатная справка по стандартным функцям есть там тоже всё подробно и с примерами.
Mark Тебе сейчас нужна строка или слово - это всё-таки разные вещи. strtok() вызывается первый раз с адресом начала буфера - перед началом цикла, а все последующие разы (внутри цикла) - NULL. Ты отладчиком снова не пользуешься? Тот код, кстати (пост #269) - работает полностью (имя файла только своё поставь) - пройдись по коду отладчиком и всё станет понятно. Чистить буфер нулями не надо - используй функцию calloc(). Если нужна строка, то обычно разделители строк - это два символа: Код (Text): char* separator = "\r\n"; Функция возвращает следующий элемент разделённый разделителями. Пример кода: Код (Text): char buf [128]; char* separators = " -<>."; char* op; strcpy (buf, " This is -a- <long> text."); op = strtok (buf, separators); <-- op = "This" op = strtok (NULL, separators); <-- op = "is" op = strtok (NULL, separators); <-- op = "a" op = strtok (NULL, separators); <-- op = "long" op = strtok (NULL, separators); <-- op = "text" op = strtok (NULL, separators); <-- op = NULL (buffer ended) Вот это ^^^^^^^ - работающий код - иди отладчиком.