1420       Конференция C SoobCha           письмо # 1421 1422  


Тема: Re: pomogite s programmoy
Дата: Fri, 19 Oct 2007 16:01:51 +0300
Кому: "C" <C@soobcha.org>
X-Mailer: The Bat! (v3.5.30) Professional
Content-Type: text/plain; charset=koi8-r
От Кого: mlx <mlx@kvant.ks.ua>

     Здравствуйте, mlx.

Вы писали 18 октября 2007 г., 17:34:36:

> Здравствуйте, C.

> izvenite za translit(
> u menya est' programma, kotoraya obrabatyvaet dva faila
> sobiraya informaciu po strokam i zapisyvaet ee v tretiy file
> eto procedura dlya billinga
> s uvelicheniem chisla abonentov
> poyavilas' problema obrabotav okolo 1000 zapisey programa vyletaet
> Sigmentation fault
> prichem chislo zapisey mozhet byt' 980 - 1020
> chuvstvuu chto delo v modeli pamyati, no kak pomenyat' ne znau
> compiler - gcc-3.5.5
> nizhe privedu kod

> #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;
> }
> fullstr[k+1]=' ';
> fullstr[k+2]='(';
> 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++)
> {
> 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);
> 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");
> 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++;
> }
> 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);
> //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;
> fgets (data, 256, fp);
> }
> fclose(fp);
> fclose(fp_sql);
> // fclose(fp1);
> }



vremenno vyshel iz situacii razbiv file s polzovatelyami (fp)
na neskol'ko po primerno 500 zapisey
problema ushla
nooo
zametil osobennost' pered tem kak uspel eto sdelat'
esli programma zapuskaetsya cherez cron
to ona vyletaet na 1011 zapisi
esli prosto iz konsoli to na 1020 zapisi
est' u kogo-to kakie-to mysli?

--
С уважением,
 mlx mailto:mlx@kvant.ks.ua


  1420 1422  
 
???Mail.ru ??? ?????
╘ 2000-2006 Сообщество Чайников