Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

Вопрос по C.

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Компилируемые языки] >> Вопрос по C.
Имя
Сообщение << Старые топики   Новые топики >>
Вопрос по C. - 2010-02-14 23:07:55.690000   
Touchdad

Сообщений: 62
Оценки: 0
Присоединился: 2010-01-19 00:20:15.140000
Задача.
1) Создать n-ное количество структур, записать их в бинарный файл.
2)Отсортировать внешней сортировкой по определённому признаку, записать в текстовый файл.

Моё решение:
1)
#include&lt;stdio.h&gt; #include&lt;stdlib.h&gt; #include&lt;time.h&gt; #include&lt;math.h&gt; struct in { &nbsp;&nbsp; double u,y; &nbsp;&nbsp; int x, StrNum; } U,; main() {&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; int n,i,z; &nbsp;&nbsp; double *uPtr, u, *yPtr, y; &nbsp;&nbsp; int *xPtr, x; &nbsp;&nbsp; n=20;&nbsp;&nbsp; /*kolichestvo struktur*/ &nbsp;&nbsp; srand(time(0)); &nbsp;&nbsp; U.StrNum=1; &nbsp;&nbsp; FILE *gfPtr; /*gfPtr = ukazatel faila good.txt*/ &nbsp; if ((gfPtr = fopen("good.txt", "w")) == NULL) &nbsp;&nbsp;&nbsp;&nbsp; printf ("File could not be opened\n"); fwrite(&amp;n, sizeof(int), 1, gfPtr); &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; for(i=0; i&lt;n; i++) &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; { &nbsp;&nbsp; &nbsp;&nbsp; U.u=rand()%10; &nbsp;&nbsp; &nbsp;&nbsp; U.x=rand()%10; &nbsp;&nbsp; &nbsp;&nbsp; U.y=rand()%10; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fseek(gfPtr, ((U.StrNum-1 )* sizeof(in))+sizeof(int), SEEK_SET); &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fwrite(&amp;U, sizeof(in), 1, gfPtr); &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; U.StrNum++; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } &nbsp;&nbsp;&nbsp; fclose(gfPtr); &nbsp;&nbsp;&nbsp; if ((gfPtr = fopen("good.txt", "r+")) == NULL) &nbsp;&nbsp;&nbsp;&nbsp; printf ("File could not be opened\n"); &nbsp; else &nbsp;&nbsp;&nbsp; {fseek(gfPtr, 0, SEEK_SET); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fread(&amp;z,sizeof(int),1,gfPtr); &nbsp;&nbsp;&nbsp; printf("%d\n\n", z); &nbsp;&nbsp; while(!feof(gfPtr)) &nbsp;&nbsp; if((fread(&amp;U,sizeof(in),1,gfPtr))!=0) &nbsp;&nbsp; { &nbsp;&nbsp; &nbsp; /*fread(&amp;UF, sizeof(inf), 1, gfPtr);*/ &nbsp;&nbsp; &nbsp; if (U.StrNum !=0) &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf("%f\n%f\n%d\n%f\n\n", U.u, U.u,&nbsp; U.x, pow((U.u+U.y),U.x)); &nbsp;&nbsp; } &nbsp;&nbsp;&nbsp; } &nbsp; fclose(gfPtr); &nbsp; printf("\n________\n"); getchar(); &nbsp; return 0; &nbsp; }
2)
#include&lt;stdio.h&gt; #include&lt;stdlib.h&gt; #include&lt;time.h&gt; #include&lt;math.h&gt; struct inf { &nbsp;&nbsp; double u,y; &nbsp;&nbsp; int x, StrNum; } UF, *bPtr; main() {&nbsp;&nbsp; &nbsp;&nbsp; inf *A, bufer; &nbsp;&nbsp; &nbsp;&nbsp; int n,i,k,z,g,razn; &nbsp;&nbsp; double *uPtr, u, *yPtr, y; &nbsp;&nbsp; int *xPtr, x; &nbsp;&nbsp; uPtr=&amp;UF.u; &nbsp;&nbsp; xPtr=&amp;UF.x; &nbsp;&nbsp; yPtr=&amp;UF.y; &nbsp;&nbsp; &nbsp;&nbsp; FILE *gfPtr; /*gfPtr = ukazatel faila good.txt*/ &nbsp;&nbsp;&nbsp; if ((gfPtr = fopen("good.txt", "r+")) == NULL) &nbsp;&nbsp;&nbsp;&nbsp; printf ("File could not be opened\n"); &nbsp;&nbsp;&nbsp;&nbsp; else &nbsp;&nbsp; { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fseek(gfPtr, 0, SEEK_SET); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fread(&amp;z,sizeof(int),1,gfPtr); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%d\n\n", z); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((z-1000)&lt;0) {razn=0;} else {razn=z-1000;}; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int bb=0;bb&lt;razn+1;bb++) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fseek(gfPtr, bb*sizeof(inf)+sizeof(int), SEEK_SET); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A=(inf*)malloc(z*sizeof(int)); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int j=0;j&lt;z;j++) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (((fread(&amp;UF,sizeof(inf),1,gfPtr))!=0) and&nbsp; (UF.StrNum !=0)) &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A[j]=UF; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("- - - - - - - - - - \n\n"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int zvzv=0;zvzv&lt;z-1;zvzv++) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {g=0; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int j=0;j&lt;z-1;j++) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((pow((A[j].u+A[j].y),A[j].x))&gt;(pow((A[j+1].u+A[j+1].y),A[j+1].x))) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bufer=A[j+1]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A[j+1]=A[j]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A[j]=bufer; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g=1; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int j=0; j&lt;z; j++) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%f\n%f\n%d\n%f\n\n", A[j].u, A[j].y,&nbsp; A[j].x, pow((A[j].u+A[j].y),A[j].x)); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } &nbsp;&nbsp;&nbsp; } &nbsp; fclose(gfPtr); &nbsp; printf("\n_______________________"); getchar(); &nbsp; return 0; }
Код маленько заточен под Dev-cpp, касается рандома. Вот в чем вопрос. когда в первом файле кол-во структур меньше 10 - все работает отлично. Как только это количество увеличеваешь - начинаються странные проблемы, при выполнении второй программы структуры чей порядковый номер превышет 10 выводятся странным образом. Никак не могу понять с чем это связано. Посмотрите пожалуйста. Буду очень благодарен.
Post #: 1
RE: Вопрос по C. - 2010-02-14 23:52:25.436666   
tеstеr

Сообщений: 377
Оценки: -46
Присоединился: 2008-02-08 17:56:40.563333
В код я особо не вник. Но при этом остаюсь уверенным что последовательность из команд
fseek( … )
fwrite( … )
и анаологичная ситуация с последовательностью
fseek( … )
fread( … )

должна быть заменена на обычные
fwrite( … )
и
fread( … )

так как установка на определённую позиция в файле не нужна.
Команда fwrite после записи в файл оставляет "курсор" в конце.
Также и команда fread оставляет его там, где ты его оставил (а именно - перед очередной записью).
Структура твоя имеет постоянный размер:
struct in
{
double u,y;
int x, StrNum;
}
Если мне не изменяет память (если изменяет то кто-нибудь пнёт)
8 + 8 + 4 + 4 = 24 байта
и городить вот такие строки (я тут не понял откуда взялась переменная in) не надо:
fseek(gfPtr, ((U.StrNum-1 )* sizeof(in))+sizeof(int), SEEK_SET);

И еще совет: в DevCpp есть отладчик и точки останова и многое другое.
Поэтому ставь точку останова, вычисляй значение выражения в ней ((U.StrNum-1 )* sizeof(in))+sizeof(int)) и тыпоймешь что твоя программа скачет по файлу а не считывает/записывает структуры данных.
Post #: 2
RE: Вопрос по C. - 2010-02-14 23:57:19.076666   
Touchdad

Сообщений: 62
Оценки: 0
Присоединился: 2010-01-19 00:20:15.140000
Сенк, сейчас посмотрю. Хотя, если честно, исходник первой части брал у однокурсника, это я его еще в два раза урезал :)
Post #: 3
RE: Вопрос по C. - 2010-02-15 11:16:07.343333   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Если ещё и переменные нормально называть будешь и код оформлять - то тогда хоть что-то будет понятно и можно будет проще найти проблему. И старайся избавляться от "волшебных чисел" в коде.

Так, на вскидку. Проверь то, что malloc возвращает. И у типа double спецификация %lf, а не просто %f.
Post #: 4
RE: Вопрос по C. - 2010-02-15 14:46:48.086666   
Touchdad

Сообщений: 62
Оценки: 0
Присоединился: 2010-01-19 00:20:15.140000
Спасибо огромное, совместил оба совета. Почистил от сиков, поменял ф на лф. Всё заработало :) Тему можно закрывать :)
Post #: 5
Страниц:  [1]
Все форумы >> [Компилируемые языки] >> Вопрос по C.







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.