Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Сортировка в файле

Ответить
Настройки темы
C/C++ - Сортировка в файле

Пользователь


Сообщения: 147
Благодарности: 0

Профиль | Отправить PM | Цитировать


Как осущесвялется сортировка в файлах и поиск.
пример.
ФАйла в одной строке одно слова.
Расортировать их по алфавиту и разбить на файлы по кол-ву букв.

Отправлено: 11:39, 09-07-2008

 

Ветеран


Сообщения: 1404
Благодарности: 135

Профиль | Отправить 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);
	}
}

-------
Ehhh.. what's up, doc?..


Последний раз редактировалось mrcnn, 09-07-2008 в 14:30.


Отправлено: 13:51, 09-07-2008 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Пользователь


Сообщения: 147
Благодарности: 0

Профиль | Отправить PM | Цитировать


WinAPI ? а чистое С но я смотрю они не сильно отличаются

Отправлено: 18:31, 09-07-2008 | #3


Ветеран


Сообщения: 1404
Благодарности: 135

Профиль | Отправить 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;
}

-------
Ehhh.. what's up, doc?..


Отправлено: 19:28, 09-07-2008 | #4


Пользователь


Сообщения: 147
Благодарности: 0

Профиль | Отправить PM | Цитировать


на русском.
блин...это ужас...это только подготовка к одному алгоритму....

кстати сюда сразу. мне надо осуществить ввод пароля...что бы при вводе выводились ****

Отправлено: 19:36, 09-07-2008 | #5


Ветеран


Сообщения: 1404
Благодарности: 135

Профиль | Отправить PM | Цитировать


[q]кстати сюда сразу. мне надо осуществить ввод пароля...что бы при вводе выводились ****[q]

Код: Выделить весь код
#include <conio.h> 
void main()
{
char buffer[5];
    int i, ch;

    for (i = 0; (i < 2) && ((ch = getch()) != EOF)
                         && (ch != '\n'); i++)
    {
       buffer[i] = (char) ch;
       printf("*");
    }
    printf("\n");   
    buffer[i] = '\0';
    printf( "Input was: %s\n", buffer);
}

-------
Ehhh.. what's up, doc?..

Это сообщение посчитали полезным следующие участники:

Отправлено: 20:33, 09-07-2008 | #6


Пользователь


Сообщения: 147
Благодарности: 0

Профиль | Отправить PM | Цитировать


вау...огромное спасибо...
даже не думал что так можно for записать мега респект..а есть книжки с такими приколами?

Отправлено: 20:35, 09-07-2008 | #7


Ветеран


Сообщения: 1404
Благодарности: 135

Профиль | Отправить PM | Цитировать


гм. это не мой код.. это код из описания функции getc в MSDN, правда там чтение идет из файла.

-------
Ehhh.. what's up, doc?..


Отправлено: 20:43, 09-07-2008 | #8


Пользователь


Сообщения: 147
Благодарности: 0

Профиль | Отправить PM | Цитировать


не могу понять уже сколько читаю...
мне надо проитать 10 строчку.
или как проситать 10 строчку и 3 символ в файле ?

Отправлено: 15:13, 10-07-2008 | #9


Ветеран


Сообщения: 1404
Благодарности: 135

Профиль | Отправить 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 строки

Код: Выделить весь код
counter=0;
booll=0;
....
for (int i=0;i<N;i++)
{
if (t[i]=='\x0a')
if (t[i-1]=='\x0d')
counter++,cnt2=-1;
if (counter==10)
{
booll=1; //10 строка
cnt2++;
}

if (booll==1 && cnt2==3)
{3 символ 10 строки}

....
}

-------
Ehhh.. what's up, doc?..

Это сообщение посчитали полезным следующие участники:

Отправлено: 16:06, 10-07-2008 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Сортировка в файле

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
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




 
Переход