Сортировка в файле
Как осущесвялется сортировка в файлах и поиск.
пример. ФАйла в одной строке одно слова. Расортировать их по алфавиту и разбить на файлы по кол-ву букв. |
Я хочу открыть файл и считать все содержимое
1. как это сделать построчно, используя WinAPI? 2. как это сделать считав весь файл сразу в какую-то переменную, используя WinAPI? Код:
void main() Ошибка была в том, что строка не инициализирована. В общем файл читается полностью так. Код:
#include <windows.h> |
WinAPI ? а чистое С но я смотрю они не сильно отличаются
|
На чистом С без WinAPI
Код:
#include <stdio.h> Если текст на латинице, то буквы можно непосредственно сравнивать. ('a'>'b') Если русский, то нужно сопоставить каждой букве числовой код. Представить каждое слово в виде массива чисел. По порядку сравнивать элементы массива между собой пока точно не станет ясно, что начальные цифры одного меньше другого. и записывать в нужном порядке в новый массив. Затем вернуть из чисел обратно в символьный вид. Как записывать в файл или читать из файла см. выше Вместо new в чистом С используется функция malloc. Код:
#include<stdio.h> |
на русском.
блин...это ужас...это только подготовка к одному алгоритму.... кстати сюда сразу. мне надо осуществить ввод пароля...что бы при вводе выводились **** |
[q]кстати сюда сразу. мне надо осуществить ввод пароля...что бы при вводе выводились ****[q]
Код:
#include <conio.h> |
вау...огромное спасибо...
даже не думал что так можно for записать=) мега респект..а есть книжки с такими приколами?=) |
гм. это не мой код.. :) это код из описания функции getc в MSDN, правда там чтение идет из файла.
|
не могу понять уже сколько читаю...
мне надо проитать 10 строчку. или как проситать 10 строчку и 3 символ в файле ? |
Перенос строки в текстовых файлах осуществляется
либо последовательностью \x0d\x0a либо \x0a См. # 2 в этой теме Посимвольно просматриваешь t в цикле и сравниваешь с \x0a (if (t[i]=='\x0a') ;. Если встретили значит произошел перенос строки. Чтобы точно убедиться в переносе считываем и проверяем предыдущий символ if (t[i-1]=='\x0d') Если это \x0d то у нас совершенно точно перенос строки и мы увеличиваем счетчик строк.Чтобы пометить что мы в 10 строке, можно завести булевую переменную и присвоить ей значение 1. При старте инициализируем ее нулем. Обнуляем переменную cnt2 и продолжаем считывать символы. Если bool==1 && cnt2==3 то у нас 3 символ 10 строки Код:
counter=0; |
mrcnn, Вроде bool пишется с одной l, а не с двумя. :tomato2:
|
booll это имя переменной, а именам переменных нельзя присваивать названия ключевых слов, поэтому я добавил в конец еще одну l
|
\x0d\x0a - это что такое я такое даже не изучал???
это какой язык?=0 |
mrcnn,
Цитата:
Код:
bool boll; |
В C нет типа bool. Булевую переменную объявляем как int или unsigned int.
В windef.h даже так и объявлено Код:
typedef int BOOL; Таким образом булевая переменная в C объявляется как Код:
int booll Код:
bool booll; Код:
bool bool; 1. в десятичной системе счисления 1,2,3 2. в восьмееричной системе счисления 01,02,03 3. в шестнадцатеричной системе счисления x1,x2,x3 Управляющие последовательности записываются с помощью символа \ Например \n \ t \r Если мы хотим в тексте написать шестнадцатеричное число, то мы его записываем с помощью управляющей последовательности \xЧИСЛО Например: \x1, \xa, \xf |
Так не чего и не понял...или у меня высасали мозг...или =))))
Можно ещё раз полный код только С ну и начало С++ Поиск в тексте (текст 1 слово одна строчка) 1. Найти слово. 2. Найти в 10 срочке 3 символ 3. Найти все слова которые начинаются на "А" 4. Найти все слова которые заканчиваются на "Б" И если не сложно то с обьяснениями, а тореально не могу вьехать...а хочу мозг прописать дял компа =) |
Вложений: 1
Цитата:
Код:
#include <windows.h> |
strng create_string(); - это что я с этим ещё не сталкивался.
|
С чем ты еще не сталкивался?
strng create_string(); это объявление функции, не имеющей параметров и возвращающей значение типа strng. Кода функции нет, программа должна искать его в другом месте, например ниже в тексте этого файла, в других cpp файлах, в lib файлах и т.д. В общем случае функции объявляются следующим образом: [тип_возвращаемого_значения] имя_функции (список_параметров) Объявление функции возможно: 1. непосредственно в файле с кодом, т.е в файлах .c/.cpp 2. в заголовочных файлах т.е в файлах .h strng create_string(); Это один из вариантов перегружаемой функции. Перегрузкой называется объявление функций с одним и тем же именем, но разным списком аргументов. В своих программах я придерживаюсь следующего порядка: Код:
заголовочные файлы и макросы Можно создать свое имя для какого-то типа данных, отражающее его сущность с помощью ключевого слова typedef typedef char* strng typedef базовый_тип_данных пользовательский_тип_данных strng create_string(); эквивалентно char* create_string(); Это нужно, чтобы функция продолжала оставаться рабочей даже если мы переопределили тип по другому, т.е например написали typedef int* strng В моей программе переопределить так тип не получится, нужна проверка в функциях на соответствие данных. В общем случае лучше в каждой функции проверять соответствие параметров нужным - это сильно упрощает последующее использование кода в каких-либо других проектах. |
Только сейчас смог запустить код
и сразу ошибки Error 1 error C2664: 'CharToOemW' : cannot convert parameter 1 from 'strng' to 'LPCWSTR' c:\documents and settings\dudaev\мои документы\visual studio 2005\projects\балда\балда\балда.cpp 216 Error 2 error C2664: 'CreateFileW' : cannot convert parameter 1 from 'strng' to 'LPCWSTR' c:\documents and settings\dudaev\мои документы\visual studio 2005\projects\балда\балда\балда.cpp 286 Error 3 error C2664: 'MessageBoxW' : cannot convert parameter 2 from 'const char [27]' to 'LPCWSTR' c:\documents and settings\dudaev\мои документы\visual studio 2005\projects\балда\балда\балда.cpp 293 и find это разве С ? hFile=CreateFile(d, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL) вот это как понять? strng - это какой тип? я такого не изучал. и как можно понять такую запись !bResult |
Цитата:
Стоит попробовать не подлежащие конвертации параметры в кавычки и L перед ними, например так L"C:\\Boot.ini" если указывать напрямую имя файла без использования переменной. Или прикрутить функцию MultiByteToWideChar Цитата:
Можно записать и строчкой, но для функций с большим количеством передаваемых параметров предложенный вариант смотрится куда лучше. Опечатка это, string хотели написать, но его нету в С, максимум в этом направлении char * !bResult отрицание этой переменной, читается как "Не bResult". |
Хорошая ошибка.
Первый вариант : заточить код под Unicode, я этого не умею - все упирается в константные указатели (я еще не совсем понимаю, как с ними работать, как "поместить" строку с неизвестной длиной в константный указатель на строку), в моем проекте указатели неконстантные. Второй вариант: Project - Properties - General - Character Set - поставить Not set Третий вариант: вместо CreateFile, MessageBox, CharToOem явно указать CreateFileA, MessageBoxA, CharToOemA find это моя пользовательская функция. Про strng, пользовательский тип данных я все объяснил выше. По поводу hFile=CreateFile сюда http://msdn.microsoft.com/en-us/library/aa363858.aspx Цитата:
BOOL ReadFile( HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped ); ReadFile возвращается значение типа BOOL Значение, возвращенное функцией было помещено в переменную bResult. Мы не знаем, что туда было помещено. Чтобы предпринять какие-то действия в зависимости от того, что в этой епременной, мы используем условный оператор if Синтаксис условного оператора IF ( ПРОВЕРОЧНОЕ_ВЫРАЖЕНИЕ) ДЕЙСТВИЕ Проверочное выражение/ условное выражение - выражение которое при выполнении оказывается либо 1, либо 0. Действие выполняется, если в проверочном выражении оказывается 1 IF ( ПРОВЕРОЧНОЕ_ВЫРАЖЕНИЕ) ДЕЙСТВИЕ 1 ELSE ДЕЙСТВИЕ 2 Действие 1 выполняется, если в условном выражении оказывается 1 Действие 2 выполняется, если в условном выражении оказывается 0 В условном выражении может понадобится проверить несколько операторов. Булева алгебра: ЛОГИЧЕСКОЕ И "возвращает" 1, если все выражение входящие в И истинны, и 0 в противном случае ЛОГИЧЕСКОЕ ИЛИ "возвращает" 1, если хотя бы одно из выражений входящих в ИЛИ истинно, и 0, если все выражения ложны ЛОГИЧЕСКОЕ НЕТ "возвращает" 1, если в выражении 0. Возвращает 0, если в выражении 1. ЛОГИЧЕСКОЕ И в языке С обозначается && ЛОГИЧЕСКОЕ ИЛИ в языке С обозначается || ЛОГИЧЕСКОЕ НЕТ в языке С обозначается ! Код:
if(!bResult) { Если в bResult оказался 0, то это означает что прочитать из файла не удалось Если в bResult оказался не 0, то это означает что прочитать из файла удалось (См что может вернуть функция Read File Код:
Nonzero indicates success. Zero indicates failure. Таким образом если в bResult оказался 0, то !bResult означает 1 Таким образом если в bResult оказался не 0, то !bResult означает 0 Если !bResult != 0, то выполняется Msg("Невозможно прочитать файл!"); Если !bResult == 0, то выполняется find(t, (int)fzi, 10,3); По другому условное выражение можно переписать так Цитата:
|
не знаю...вообще тут все как то сильно накручено.
попробую сам написать. единственое что обьясните. пройтись по всему файлу и запиать в масив.дальше я уже что то добавлю сам. |
Откраваешь файл для чтения и записи, измеряешь размер фаула, создаешь динамический массив таккого размеры, читаеешь туды весь фаул, сортируешь массив, ставишь указатель на начало фаула и сбрасываешь туда весь массив. В результате файл содержит упорядоченные данные.
|
Код:
while((ch=fgetc(login_txt)) != '\n') |
надо '\n' заменить на EOF
|
прекрасно...только мне надо что бы был первый цикл проверял EOF если нет..то заходил во второй и там записывал до '\n'
|
Цитата:
EOF всегда есть! EndOfFile |
Алгоритм:
Записывает по символьно...до '\n' проверяет является это равно другой переменной. если не равняеся то переход в следущую строчку...и так далее до EOF |
Время: 22:19. |
Время: 22:19.
© OSzone.net 2001-