1418
Конференция C SoobCha
письмо # 1419
|
1420 |
|
Hello mlx,Thursday, October 18, 2007, 6:34:36 PM, you wrote: > #include <stdio.h> > #include <string.h> > #include <stdlib.h> > #include <math.h> > double extractor (char* u_name) > { > FILE *fp; > char fullstr[108]; > char data_ch[256]; > char value[15]; > int i,k,j,t,p=0; > int tmp=strlen(u_name); > fullstr[0]='C'; > fullstr[1]='h'; > fullstr[2]='a'; > fullstr[3]='i'; > fullstr[4]='n'; > fullstr[5]=' '; > for (i=6;i<tmp+6;i++) { > fullstr[i]=u_name[i-6]; > k=i; > } // Тут лучше использовать strcpy(&fullstr[6],u_name); k=6+tmp; > fullstr[k+1]=' '; > fullstr[k+2]='('; // Обязательно добавить в конец строки '\0' fullstr[k+3] = '\0'; > fp=fopen ("/tmp/chains","r"); > // printf ("\nstr:'%s'",fullstr); > while (feof(fp)==0) > { > fgets (data_ch, 256, fp); > for (j=0;j<k+2;j++) // k+2 или k+3 ? Если k+2, то скобка не участвует. > { > if (data_ch[j]==fullstr[j]) > p++; > } > // printf ("p=%d,tmp=%d",p,tmp); > if (p==tmp+7) { > fgets (data_ch, 256, fp); > fgets (data_ch, 256, fp); // Дальше полная чушь. Откуда ты взял, что в строке обязательно будет // 17 символов и среди них будет хоть один пробелл или не пробелл? // Найди конец строки, отсей '\n', а потом отсекай хвостовые пробелы. // Или, наоборот, сканируй от начала строки, пропускай лишнее, // остальное хватай. Строки копируй с помощью strcpy или strncpy. На // худой конец memcpy. И чем вызван пропуск строки? Это специально? // Попробуй почитать про функцию sscanf -- не будет ли удобнее // воспользоваться ею. > i=16; t=0; > while (data_ch[i]!=' ') { > t++; > i--; > } > k=0; > for (j=16-t+1;j<=16;j++) { > value[k]=data_ch[j]; > k++; > } > break; > } // Счетчики, временные переменные и временные указатели лучше // инициализировать непосредственно перед использованием, а не после, // тем более, что он не всегда будет очищаться. > p=0; > } // Опять забыл ограничить строку, а еще удивляешся ошибке. > return atol(value); > } > main () > { > FILE *fp, *fp_sql, *ftmp; > char data[256]; > char data_ch[256]; > char u_name[100]; > char t_price[8]; > char t_admin[2]; > char str_tmp[256]; > char chain_name[108]; > char value[15]; > long bytes=0; > double price, tmp_money, b2; > int admin; > int i=0, j=0, k=0, f=0, count_1=0, p=0, d=0, t=0, count_2=0, z=0, counter=0; > int DAT=system("date +%d > /tmp/date.time"); > int DAT2=system("date +%m > /tmp/month.time"); > int DAT3=system("date +%H > /tmp/hour.time"); > int DAT4=system("date +%M > /tmp/minute.time"); > ftmp=fopen ("/tmp/date.time","r"); // Опять-таки не лучше ли sscanf? Или системмные функции работы со // временем? > fgets (str_tmp,256,ftmp); > DAT=atoi(str_tmp); > fclose(ftmp); > ftmp=fopen ("/tmp/month.time","r"); > fgets (str_tmp,256,ftmp); > DAT2=atoi(str_tmp); > fclose(ftmp); > ftmp=fopen ("/tmp/hour.time","r"); > fgets (str_tmp,256,ftmp); > DAT3=atoi(str_tmp); > fclose(ftmp); > ftmp=fopen ("/tmp/minute.time","r"); > fgets (str_tmp,256,ftmp); > DAT4=atoi(str_tmp); > fclose(ftmp); > // printf ("\nDAT=%d, DAT2=%d, DAT3=%d, DAT4=%d\n",DAT,DAT2,DAT3,DAT4); > fp=fopen ("/tmp/collect_users","r"); > fp_sql=fopen ("/tmp/collector_step","w"); > fgets (data, 256, fp); > fgets (data, 256, fp); > while (feof(fp)==0) > { > j=0; counter++; > printf ("\n counter=%d",counter); > while (data[j]!='\t') { > u_name[j]=data[j]; j++; > } // Опять не закрыл строку, к тому же забыл ее длину. > j++; k=j; > while (data[j]!='\t') { > t_price[j-k]=data[j]; j++; > } // Лучше бы использовать для позиционирования в строках-получателях char* // или второй счетчик гонять от нуля до как получится. Не жалей // операций. Твоя прога и так не очень оптимальна, но самый главный // тормоз здесь -- операции с файлами. По сравнением с ними все // остальное работает мгновенно. А с двумя счетчиками или счетчиком и // указателем будет читаться легче. Я, собсвенно, даже не уверен, что // правильно уловил, что ты делаешь. > j++; k=j; > while (data[j]!='\n') { > t_admin[j-k]=data[j]; j++; > } > k=0; j=0; i=0; > price=atof(t_price); > admin=atoi(t_admin); > printf ("\nu_name=%s, price=%f, admin=%d",u_name,price,admin); > bytes=extractor(u_name); // Сперва в функции переводишь строку в long, потом в double, а теперь // опять в long? Не хорошо! К тому же не используешь функцию // округления. Впрочем, подозреваю, что и переменную bytes ты хотел // сделать типа double. > //printf ("\nu_name=%s, price=%f, admin=%d, > bytes=%ld",u_name,price,admin,bytes); > if (bytes>3) { > // printf ("\nu_name=%s, price=%f, admin=%d, > bytes=%ld",u_name,price,admin,bytes); > if (admin<10) { > // b2=bytes/1048576; > b2=bytes*0.00000095367432; > // printf (" b2=%f",b2); > tmp_money=b2*price; > // printf ("money=%f",tmp_money); > fprintf (fp_sql,"INSERT INTO Bill_day_m VALUES > (%d,%d,%d,%d,'%s',%ld,%ld);\n",DAT,DAT2,DAT3,DAT4,u_name,bytes,bytes); > fprintf (fp_sql,"INSERT INTO Bill_day VALUES > (%d,%d,%d,%d,'%s',%ld,%ld);\n",DAT,DAT2,DAT3,DAT4,u_name,bytes,bytes); > fprintf (fp_sql,"UPDATE Balance SET > money_rest=money_rest-%f WHERE login='%s';\n",tmp_money,u_name); > } > if (admin==12) { > b2=bytes*0.00000095367432; > // printf (" b2=%f",b2); > tmp_money=b2*price; > // printf ("money=%f",tmp_money); > fprintf (fp_sql,"INSERT INTO Bill_day_m VALUES > (%d,%d,%d,%d,'%s',%ld,%ld);\n",DAT,DAT2,DAT3,DAT4,u_name,bytes,bytes); > fprintf (fp_sql,"INSERT INTO Bill_day VALUES > (%d,%d,%d,%d,'%s',%ld,%ld);\n",DAT,DAT2,DAT3,DAT4,u_name,bytes,bytes); > fprintf (fp_sql,"UPDATE Balance SET > money_rest=money_rest-%f WHERE login='%s';\n",tmp_money,u_name); > } > if (admin==10) { > fprintf (fp_sql,"INSERT INTO Bill_day_m VALUES > (%d,%d,%d,%d,'%s',%ld,%ld);\n",DAT,DAT2,DAT3,DAT4,u_name,bytes,bytes); > fprintf (fp_sql,"INSERT INTO packet_Bill_day VALUES > (%d,%d,%d,%d,'%s',%ld);\n",DAT,DAT2,DAT3,DAT4,u_name,bytes); > fprintf (fp_sql,"UPDATE active_packets set > bytes_left=bytes_left-%ld where login='%s' and active=1;\n",bytes,u_name); > } > if (admin==11) { > fprintf (fp_sql,"INSERT INTO Bill_day_m VALUES > (%d,%d,%d,%d,'%s',%ld,%ld);\n",DAT,DAT2,DAT3,DAT4,u_name,bytes,bytes); > } > } // Эти операторы печати я не проверял, но печать незакрытых строк // может привести (и приводит) к ошибке. > for (i=0;i<100;i++) u_name[i]=0; > for (i=0;i<108;i++) chain_name[i]=0; > for (i=0;i<8;i++) t_price[i]=0; > for (i=0;i<2;i++) t_admin[i]=0; // Обнулять в конце -- это хорошо :-( Только не забывай, что // перед первым использованием ты их не обнулял! И если бы ты закрывал // строки символом '\0' в конце наполнения, то это очень долгое обнуление // не понадобилось бы вообще. // Помни! Та переменная, значение которой ты не задал, может иметь // любое значение! Лучше всего обнулять непосредственно перед циклом, // где ее используешь, иначе можешь забыть о том, что переменная не // проинициализирована. Строки без особой надобности не // инициализируют, но внимательно за ними следят. > fgets (data, 256, fp); > } > fclose(fp); > fclose(fp_sql); > // fclose(fp1); > } Прошу прощения, я не проверял эту программу тщательно, но я не знаю, что от нее требуется. -- Best regards, Valentin mailto:klvalent@gmail.com |
1418
|
1420 |
|
|
|
|