Вопрос по C.
Пользователи, просматривающие топик: none
|
Зашли как: Guest
|
Имя |
Сообщение |
<< Старые топики Новые топики >> |
|
|
Вопрос по C. - 2010-02-14 23:07:55.690000
|
|
|
Touchdad
Сообщений: 62
Оценки: 0
Присоединился: 2010-01-19 00:20:15.140000
|
Задача. 1) Создать n-ное количество структур, записать их в бинарный файл. 2)Отсортировать внешней сортировкой по определённому признаку, записать в текстовый файл. Моё решение: 1)
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
struct in
{
double u,y;
int x, StrNum;
} U,;
main()
{
int n,i,z;
double *uPtr, u, *yPtr, y;
int *xPtr, x;
n=20; /*kolichestvo struktur*/
srand(time(0));
U.StrNum=1;
FILE *gfPtr; /*gfPtr = ukazatel faila good.txt*/
if ((gfPtr = fopen("good.txt", "w")) == NULL)
printf ("File could not be opened\n");
fwrite(&n, sizeof(int), 1, gfPtr);
for(i=0; i<n; i++)
{
U.u=rand()%10;
U.x=rand()%10;
U.y=rand()%10;
fseek(gfPtr, ((U.StrNum-1 )* sizeof(in))+sizeof(int), SEEK_SET);
fwrite(&U, sizeof(in), 1, gfPtr);
U.StrNum++;
}
fclose(gfPtr);
if ((gfPtr = fopen("good.txt", "r+")) == NULL)
printf ("File could not be opened\n");
else
{fseek(gfPtr, 0, SEEK_SET);
fread(&z,sizeof(int),1,gfPtr);
printf("%d\n\n", z);
while(!feof(gfPtr))
if((fread(&U,sizeof(in),1,gfPtr))!=0)
{
/*fread(&UF, sizeof(inf), 1, gfPtr);*/
if (U.StrNum !=0)
printf("%f\n%f\n%d\n%f\n\n", U.u, U.u, U.x, pow((U.u+U.y),U.x));
}
}
fclose(gfPtr);
printf("\n________\n");
getchar();
return 0;
}
2)
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
struct inf
{
double u,y;
int x, StrNum;
} UF, *bPtr;
main()
{
inf *A, bufer;
int n,i,k,z,g,razn;
double *uPtr, u, *yPtr, y;
int *xPtr, x;
uPtr=&UF.u;
xPtr=&UF.x;
yPtr=&UF.y;
FILE *gfPtr; /*gfPtr = ukazatel faila good.txt*/
if ((gfPtr = fopen("good.txt", "r+")) == NULL)
printf ("File could not be opened\n");
else
{
fseek(gfPtr, 0, SEEK_SET);
fread(&z,sizeof(int),1,gfPtr);
printf("%d\n\n", z);
if ((z-1000)<0) {razn=0;} else {razn=z-1000;};
for (int bb=0;bb<razn+1;bb++)
{
fseek(gfPtr, bb*sizeof(inf)+sizeof(int), SEEK_SET);
A=(inf*)malloc(z*sizeof(int));
for (int j=0;j<z;j++)
if (((fread(&UF,sizeof(inf),1,gfPtr))!=0) and (UF.StrNum !=0))
{
A[j]=UF;
}
printf("- - - - - - - - - - \n\n");
for (int zvzv=0;zvzv<z-1;zvzv++)
{g=0;
for (int j=0;j<z-1;j++)
{
if ((pow((A[j].u+A[j].y),A[j].x))>(pow((A[j+1].u+A[j+1].y),A[j+1].x)))
{
bufer=A[j+1];
A[j+1]=A[j];
A[j]=bufer;
g=1;
}
}
}
for (int j=0; j<z; j++)
{
printf("%f\n%f\n%d\n%f\n\n", A[j].u, A[j].y, A[j].x, pow((A[j].u+A[j].y),A[j].x));
}
}
}
fclose(gfPtr);
printf("\n_______________________");
getchar();
return 0;
}
Код маленько заточен под Dev-cpp, касается рандома. Вот в чем вопрос. когда в первом файле кол-во структур меньше 10 - все работает отлично. Как только это количество увеличеваешь - начинаються странные проблемы, при выполнении второй программы структуры чей порядковый номер превышет 10 выводятся странным образом. Никак не могу понять с чем это связано. Посмотрите пожалуйста. Буду очень благодарен.
|
|
|
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)) и тыпоймешь что твоя программа скачет по файлу а не считывает/записывает структуры данных.
|
|
|
RE: Вопрос по C. - 2010-02-14 23:57:19.076666
|
|
|
Touchdad
Сообщений: 62
Оценки: 0
Присоединился: 2010-01-19 00:20:15.140000
|
Сенк, сейчас посмотрю. Хотя, если честно, исходник первой части брал у однокурсника, это я его еще в два раза урезал :)
|
|
|
RE: Вопрос по C. - 2010-02-15 11:16:07.343333
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
Если ещё и переменные нормально называть будешь и код оформлять - то тогда хоть что-то будет понятно и можно будет проще найти проблему. И старайся избавляться от "волшебных чисел" в коде. Так, на вскидку. Проверь то, что malloc возвращает. И у типа double спецификация %lf, а не просто %f.
|
|
|
RE: Вопрос по C. - 2010-02-15 14:46:48.086666
|
|
|
Touchdad
Сообщений: 62
Оценки: 0
Присоединился: 2010-01-19 00:20:15.140000
|
Спасибо огромное, совместил оба совета. Почистил от сиков, поменял ф на лф. Всё заработало :) Тему можно закрывать :)
|
|
|
|
|