1. Пользуйтесь тегами кода. - [code] ... [/code] 2. Точно указывайте язык, название и версию компилятора (интерпретатора). 3. Название темы должно быть информативным. В описании темы указываем язык!!!
есть алгоритм многофазной сортировки, которая работает с файлами. в делфи это был file of integer. поскольку в с++ абсолютного аналога нет, возник вопрос - что выбрать из имеющихся средств? Запуталась В чем разница между парами: fread-fwrite; (для всего подряд?) fscanf-fprintf; (форматированный ввод/вывод? то есть %d - и будет мне десятичное целое число, как и хочется?) fgets-fputs; (это вроде для строк.... то есть потом можно сделать IntToStr...)
подскажете?
--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует. На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
void MergeSort(void) { const T=3,p=2; int suma=0,sumd=0; int A[T],D[T],TAPE[T]; MakeFile(); Start(T,p,A,D,TAPE,&suma,&sumd); FILE *Lenta[3]; Lenta[TAPE[T-1]]=fopen("L2.dat","wb+"); for (int j=0;j<T-1;j++) Lenta[TAPE[j]]=fopen(("L"+IntToStr(j)+".dat").c_str(),"rb"); int Dmax=0, Dost[3]; int sort[3]; while (Dmax<suma) { while ( ((fread(&sort[0],sizeof(sort[0]),1,Lenta[TAPE[0]]))!=0)&&((fread(&sort[1],sizeof(sort[1]),1,Lenta[TAPE[1]]))!=0) ) //вот здесь считывается лишнее - одна лента кончилась, а вторая еще нет { for (int j=0;j<T;j++) Dost[j]=D[j]; int zerro=0; while (zerro<T-1) { int min=MaxInt; int mini; for (int i=0;i<T-1;i++) if ((sort[TAPE[i]]<=min)&&(Dost[TAPE[i]]>0)) { min=sort[TAPE[i]]; mini=i; } fwrite(&min,sizeof(min),1,Lenta[TAPE[T-1]]); Dost[TAPE[mini]]--; if (Dost[TAPE[mini]]>0) fread(&sort[TAPE[mini]],sizeof(sort[mini]),1,Lenta[TAPE[mini]]); else { sort[TAPE[mini]]=MaxInt; zerro++; } } } for (int i=0;i<T-1;i++) if (feof(Lenta[TAPE[i]])) //если кончилась лента.... { D[TAPE[T-1]]=0; for (int j=0;j<T-1;j++) D[TAPE[T-1]]+=D[TAPE[j]]; Dmax=D[TAPE[T-1]]; int zap; fclose(Lenta[TAPE[T-1]]); Lenta[TAPE[T-1]]=fopen(("L"+IntToStr(TAPE[T-1])+".dat").c_str(),"rb"); int j=TAPE[i]; TAPE[i]=TAPE[T-1]; TAPE[T-1]=j; fclose(Lenta[TAPE[T-1]]); Lenta[TAPE[T-1]]=fopen(("L"+IntToStr(TAPE[T-1])+".dat").c_str(),"wb+"); } else fseek(Lenta[TAPE[i]],-1*sizeof(i),SEEK_CUR); //а если не кончилась, надо вернуться к предыдущему эл-ту... }
fcloseall; }
--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует. На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!