|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Сортировка в файле |
|
|
C/C++ - Сортировка в файле
|
Пользователь Сообщения: 147 |
Профиль | Отправить PM | Цитировать Как осущесвялется сортировка в файлах и поиск.
пример. ФАйла в одной строке одно слова. Расортировать их по алфавиту и разбить на файлы по кол-ву букв. |
|
Отправлено: 11:39, 09-07-2008 |
Ветеран Сообщения: 1404
|
Профиль | Отправить PM | Цитировать Я хочу открыть файл и считать все содержимое
1. как это сделать построчно, используя WinAPI? 2. как это сделать считав весь файл сразу в какую-то переменную, используя WinAPI? void main() { strng d="log.txt"; HANDLE hFile; strng t; DWORD cbreading; DWORD fzi; LPDWORD dwSizeHigh; if (hFile=CreateFile(d, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL)) { fzi = GetFileSize(hFile, NULL); printf("%d", fzi); //OK - 304 ReadFile(hFile,&t,fzi,&cbreading,NULL); // как организовать цикл считывающий построчно? printf("%s",&t); //глюк. если выше написать ReadFile(hFile,&t,100,&cbreading,NULL); то все ОК. Почему? CloseHandle(hFile); } } Ошибка была в том, что строка не инициализирована. В общем файл читается полностью так. #include <windows.h> #include <stdio.h> #define Msg(x) MessageBox(0,x,"program",MB_OK) typedef char* strng; strng create_string(); strng create_string(int sz); void delete_string(strng m); void print_string(strng t); void terminate_string(strng m, int sz); strng create_string(int sz) { strng m; m = new char[sz+1]; terminate_string(m, sz+1); return (m); } void delete_string(strng m) { delete[] m; } void print_string(strng t) { int i; for (i=0;t[i]!='\0';i++) { printf("%C",t[i]); } printf("\n"); } void terminate_string(strng m, int sz) { m[sz-1]='\0'; } void main() { strng d="log.txt"; strng e="log1.txt"; HANDLE hFile, hCopy; strng t; DWORD cbreading; DWORD fzi; BOOL bResult; if (hFile=CreateFile(d, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL)) { fzi = GetFileSize(hFile, NULL); t=create_string(fzi); bResult = ReadFile(hFile, t, fzi, &cbreading, NULL); if(!bResult) { Msg("Невозможно прочитать файл!"); } else { hCopy=CreateFile(e, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, NULL, NULL); WriteFile(hCopy, t, fzi, &cbreading, NULL); CloseHandle(hCopy); } print_string(t); delete_string(t); CloseHandle(hFile); } } |
------- Последний раз редактировалось mrcnn, 09-07-2008 в 14:30. Отправлено: 13:51, 09-07-2008 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Пользователь Сообщения: 147
|
Профиль | Отправить PM | Цитировать WinAPI ? а чистое С но я смотрю они не сильно отличаются
|
Отправлено: 18:31, 09-07-2008 | #3 |
Ветеран Сообщения: 1404
|
Профиль | Отправить PM | Цитировать На чистом С без WinAPI
#include <stdio.h> int main() { FILE *in; char* d="try.c"; if((in = fopen(d,"rt"))==NULL) { fprintf(stderr, "Не могу открыть файл \n"); } while(!feof(in)){ fputc(fgetc(in), stdout); } fclose(in); return(0); } Если текст на латинице, то буквы можно непосредственно сравнивать. ('a'>'b') Если русский, то нужно сопоставить каждой букве числовой код. Представить каждое слово в виде массива чисел. По порядку сравнивать элементы массива между собой пока точно не станет ясно, что начальные цифры одного меньше другого. и записывать в нужном порядке в новый массив. Затем вернуть из чисел обратно в символьный вид. Как записывать в файл или читать из файла см. выше Вместо new в чистом С используется функция malloc. #include<stdio.h> #include<string.h> #include<alloc.h> #include<process.h> int main(void) { char *str; /* выделить память под строку */ if((str = malloc(10)) == NULL) { printf("Недостаточно памяти\n"); exit(1); /* завершение с кодом ошибки */ } /* скопировать в строку "Hello" */ strcpy(str,"Hello"); /* вывести строку */ printf("Строка: %s\n",str); /* освободить память */ free(str); return 0; } |
------- Отправлено: 19:28, 09-07-2008 | #4 |
Пользователь Сообщения: 147
|
Профиль | Отправить PM | Цитировать на русском.
блин...это ужас...это только подготовка к одному алгоритму.... кстати сюда сразу. мне надо осуществить ввод пароля...что бы при вводе выводились **** |
|
Отправлено: 19:36, 09-07-2008 | #5 |
Ветеран Сообщения: 1404
|
Профиль | Отправить PM | Цитировать [q]кстати сюда сразу. мне надо осуществить ввод пароля...что бы при вводе выводились ****[q]
|
------- Отправлено: 20:33, 09-07-2008 | #6 |
Пользователь Сообщения: 147
|
Профиль | Отправить PM | Цитировать вау...огромное спасибо...
даже не думал что так можно for записать мега респект..а есть книжки с такими приколами? |
Отправлено: 20:35, 09-07-2008 | #7 |
Ветеран Сообщения: 1404
|
Профиль | Отправить PM | Цитировать гм. это не мой код.. это код из описания функции getc в MSDN, правда там чтение идет из файла.
|
------- Отправлено: 20:43, 09-07-2008 | #8 |
Пользователь Сообщения: 147
|
Профиль | Отправить PM | Цитировать не могу понять уже сколько читаю...
мне надо проитать 10 строчку. или как проситать 10 строчку и 3 символ в файле ? |
Отправлено: 15:13, 10-07-2008 | #9 |
Ветеран Сообщения: 1404
|
Профиль | Отправить PM | Цитировать Перенос строки в текстовых файлах осуществляется
либо последовательностью \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 строки |
------- Отправлено: 16:06, 10-07-2008 | #10 |
|
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
CMD/BAT - Сортировка файлов | kt626 | Скриптовые языки администрирования Windows | 2 | 28-03-2009 10:47 | |
Сортировка... | skeletor | Хочу все знать | 14 | 16-03-2007 18:32 | |
Сортировка в Exсel | Evita | Хочу все знать | 2 | 11-01-2006 14:24 | |
Многофазная сортировка | mask | Программирование и базы данных | 1 | 04-06-2003 23:40 | |
Быстрая сортировка | noname00.pas | Программирование и базы данных | 12 | 04-03-2002 17:32 |
|