18. september 2004 - 15:07
Der er
51 kommentarer og 1 løsning
hent del af linie fra fil
dav jeg skal hente en del af en line i en fil og sammenligne den del med andre dele fra andre linier i den samme fil. filen er opbygget sådan: den del mellem comma | 10:10:10,20.20,3030.30,XXX 15:15:15,25.25,3535.35,YYY 20.20 skal sammenlignes med 25.25 den skal så skrive den mindste værdi ud.
Annonceindlæg fra Deloitte
18. september 2004 - 15:12
#1
Du finder vel det første komma og det næste komma og snupper tallet mellem dem !?
18. september 2004 - 15:13
#2
ja men jeg ved ikke helt hvordan det gøres?
18. september 2004 - 15:14
#3
Jeg prøver at lave et eksempel
18. september 2004 - 15:16
#4
takker
18. september 2004 - 15:18
#5
#include <stdio.h> #include <stdlib.h> #include <string.h> double pick(char *s) { char *p1,*p2,buf[16]; p1 = strchr(s,',') + 1; p2 = strchr(p1,','); strncpy(buf,p1,p2-p1); buf[p2-p1] = '\0'; return atof(buf); } void compare(char *s1,char *s2) { double x1 = pick(s1); double x2 = pick(s2); if(x1 < x2) printf("%s er mindre end %s\n",s1,s2); else printf("%s er ikke mindre end %s\n",s1,s2); } int main() { compare("10:10:10,20.20,3030.30,XXX", "15:15:15,25.25,3535.35,YYY"); return 0; }
18. september 2004 - 15:24
#6
hvad så hvis jeg har 100 eller 200 linier i den fil?
18. september 2004 - 15:26
#7
Du skal løbe hele filen igennem og finde den mindste værdi ?
18. september 2004 - 15:34
#8
#include <stdio.h> #include <stdlib.h> #include <string.h> double pick(char *s) { char *p1,*p2,buf[16]; p1 = strchr(s,',') + 1; p2 = strchr(p1,','); strncpy(buf,p1,p2-p1); buf[p2-p1] = '\0'; return atof(buf); } double findmin(char *fnm) { double res,x; char line[200]; FILE *fp; res = 1000000; fp = fopen(fnm,"r"); while(!feof(fp) && fgets(line,sizeof(line),fp)) { x = pick(line); if(x < res) res = x; } return res; } int main() { double min = findmin("findmin.dat"); printf("mindste er %f\n",min); return 0; }
18. september 2004 - 15:42
#9
kan jeg få dig til at forklare lidt hvad coden gør:-D
18. september 2004 - 15:49
#10
double pick(char *s) { char *p1,*p2,buf[16]; p1 = strchr(s,',') + 1; /* finder starten af tallet - lige efter det første komma */ p2 = strchr(p1,','); /* finder det næste komma */ strncpy(buf,p1,p2-p1); /* kopierer fra start til slut til en ny buffer */ buf[p2-p1] = '\0'; return atof(buf); /* returnerer buffer konverteret til tal */ }
18. september 2004 - 15:51
#11
double findmin(char *fnm) { double res,x; char line[200]; FILE *fp; res = 1000000; /* sæt minimum til meget stort tal */ fp = fopen(fnm,"r"); /* åben fil for læsning */ while(!feof(fp) && fgets(line,sizeof(line),fp)) /* så længe der er linier læs dem */ { x = pick(line); /* hent værdi fra linie */ if(x < res) res = x; /* hvis værdi mindre end minimum så sæt minimum til værdi */ } return res; }
18. september 2004 - 15:51
#12
jeg prøver lige at få det til at virke:-D
18. september 2004 - 16:12
#13
den skriver 1000000.000000 ??????? double pick(char *s) { char *p1, *p2, buf[16]; p1=strchr(s,',') +1; p2=strchr(p1,','); strncpy(buf,p1,p2-p1); buf[p2-p1] = '\0'; return atof(buf); } double findmin(char *fnm) { double res,x; char line[200]; FILE *fp; res = 1000000; fp = fopen(fnm,"r"); while(!feof(fp) && fgets(line,sizeof(line),fp)) { x = pick(line); if(x < res) res = x; } return res; } void readlog(void) { FILE *stream; char filnavn[50]; struct date d; getdate(&d); sprintf(filnavn,"%4d%02d%02d.csv",d.da_year,d.da_mon,d.da_day); double min = findmin("filnavn"); gotoxy(2,10); printf("mindste er %f", min); fclose(stream); }
18. september 2004 - 16:13
#14
det er kun udsnit af den hele kode, det for mangler main funktion og include filerne
18. september 2004 - 16:14
#15
Så finder den ingen linier. Formentlig fordi filnavnet er forkert i: double min = findmin("filnavn");
18. september 2004 - 16:46
#16
så virker det:-D mange tak for hjælpen -=arne_v owner alle c++ programmøre!=-
18. september 2004 - 17:32
#17
hvad så hvis det er den næste værdi der skal hentes ??? den | 10:10:10,20.20,3030.30,XXX 15:15:15,25.25,3535.35,YYY
18. september 2004 - 17:33
#18
double pick2(char *s) { char *p1, *p2, buf[16]; p1=strchr(s,',') +1; p1=strchr(p1,',') +1; p2=strchr(p1,','); strncpy(buf,p1,p2-p1); buf[p2-p1] = '\0'; return atof(buf); }
18. september 2004 - 17:42
#19
nu du er igang, hvordan får vi så tiden ud?? det skal være tiden som høre til den samme linie som vi henter de andre værdier ud fra. den | 10:10:10,20.20,3030.30,XXX 15:15:15,25.25,3535.35,YYY
18. september 2004 - 17:59
#20
Det er nemt nok at fiske strengen med de 8 tegn ud. Men vil du have den som streng eller skal den omregnes til et eller andet tal - og hvis det sidste hvordan ?
18. september 2004 - 18:02
#21
den skal bare være streng - Tak
18. september 2004 - 18:06
#22
void picktime(char *s,char *retbuf) { strncpy(retbuf,s,8); retbuf[8]='\0'; } bemærk kaldes som: char tim[9]; picktime(line,tim);
18. september 2004 - 18:37
#23
hvordan definere vi hvilken linie den skal hente det fra, når den skal køre sammen med de andre funktioner???
18. september 2004 - 19:16
#24
fp = fopen(fnm,"r"); while(!feof(fp) && fgets(line,sizeof(line),fp)) { x = pick(line); y = pick2(line); char tim[9]; picktime(line,tim); ... }
18. september 2004 - 19:57
#25
nu har vi prøvet at skrive koden lidt om så det er i samme funktion men den tager tiden fra den nederste linie? double findmin_vind(char *fnm) { double res,x; char line[200],*s,*retbuf; FILE *fp; res = 1000000; fp = fopen(fnm,"r"); while(!feof(fp) && fgets(line,sizeof(line),fp)) { x = get_vind(line); if(x < res) res = x; strncpy(retbuf,line,8); line[8] = '\0'; gotoxy (10,10); printf ("%s",line); } return res; }
18. september 2004 - 21:07
#26
prøv: void findmin_vind(char *fnm,double *res,char *tim) { double x; char line[200]; FILE *fp; *res = 1000000; fp = fopen(fnm,"r"); while(!feof(fp) && fgets(line,sizeof(line),fp)) { x = get_vind(line); if(x < *res) { *res = x; strncpy(retbuf,line,8); line[8] = '\0'; } } }
18. september 2004 - 21:52
#27
skal retbuf ikke erkleres og defineres, der ud over siger den at tim never used?
18. september 2004 - 21:53
#28
Der var vist et par fejl i den. void findmin_vind(char *fnm,double *res,char *retbuf) { double x; char line[200]; FILE *fp; *res = 1000000; fp = fopen(fnm,"r"); while(!feof(fp) && fgets(line,sizeof(line),fp)) { x = get_vind(line); if(x < *res) { *res = x; strncpy(retbuf,line,8); retbuf[8] = '\0'; } } }
18. september 2004 - 22:03
#29
klokken er også mange:-D hvad skal den så kaldes med?
18. september 2004 - 22:04
#30
double min; char tim[9]; findmin_vind("noget.fil", &min, tim);
18. september 2004 - 22:17
#31
nu siger den: Value of type void is not allowed.
18. september 2004 - 22:18
#32
Hvordan kalder du den ?
18. september 2004 - 22:19
#33
double min_vind = findmin_vind(filnavn, &min, tim);
18. september 2004 - 22:21
#34
findmin_vind(filnavn, &min, tim); eller findmin_vind(filnavn, &min_vind, tim); min værdiet er et argument ikke en returværdi nu
18. september 2004 - 22:47
#35
så er der kun et problem mere:-D den skriver "1000000.00" når den læser 'tryk' 4 gang og ved 'vind' 5. gang. tiden skriver "-$0" tid vind tryk | | | 10:10:10,20.20,3030.30,XXX kilde kode: double get_vind(char *s) { char *p1, *p2, buf[16]; p1=strchr(s,',') +1; p2=strchr(p1,','); strncpy(buf,p1,p2-p1); buf[p2-p1] = '\0'; return atof(buf); } double get_luft(char *s) { char *p1, *p2, buf[16]; p1=strchr(s,',') +1; p1=strchr(p1,',') +1; p2=strchr(p1,','); strncpy(buf,p1,p2-p1); buf[p2-p1] = '\0'; return atof(buf); } void findmin_vind(char *fnm, double *res, char *retbuf) { double x; char line[200]; FILE *fp; *res = 1000000; fp = fopen(fnm,"r"); while(!feof(fp) && fgets(line,sizeof(line),fp)) { x = get_vind(line); if(x < *res) { *res = x; strncpy(retbuf,line,8); line[8] = '\0'; } } } double findmax_vind(char *fnm) { double res,x; char line[200]; FILE *fp; res = 0; fp = fopen(fnm,"r"); while(!feof(fp) && fgets(line,sizeof(line),fp)) { x = get_vind(line); if(res < x) res = x; } return res; } double findmin_luft(char *fnm) { double res,x; char line[200]; FILE *fp; res = 1000000; fp = fopen(fnm,"r"); while(!feof(fp) && fgets(line,sizeof(line),fp)) { x = get_luft(line); if(x < res) res = x; } return res; } double findmax_luft(char *fnm) { double res,x; char line[200]; FILE *fp; res = 0; fp = fopen(fnm,"r"); while(!feof(fp) && fgets(line,sizeof(line),fp)) { x = get_luft(line); if(res < x) res = x; } return res; } void readlog(void) { FILE *stream; char filnavn[50]; struct date d; char val1, val2; double min_vind; char tim[8]; getdate(&d); sprintf(filnavn,"%4d%02d%02d.csv",d.da_year,d.da_mon,d.da_day); findmin_vind(filnavn, &min_vind, tim); double max_vind = findmax_vind(filnavn); double min_luft = findmin_luft(filnavn); double max_luft = findmax_luft(filnavn); fclose(stream); gotoxy(44,7); printf("Min:"); gotoxy(62,7); printf("Max:"); gotoxy(37,9); printf("Vind:"); gotoxy(44,9); printf("%02.2f, %s", min_vind, tim); gotoxy(62,9); printf("%02.2f", max_vind); gotoxy(37,12); printf("Tryk:"); gotoxy(44,12); printf("%3.2f", min_luft); gotoxy(62,12); printf("%3.2f", max_luft); }
18. september 2004 - 22:51
#36
Det lyder som om du skal skippe nogle linier i toppen af filen. void findmin_vind(char *fnm,double *res,char *retbuf) { double x; char line[200]; FILE *fp; *res = 1000000; fp = fopen(fnm,"r"); fgets(line,sizeof(line),fp); /* skip linie */ fgets(line,sizeof(line),fp); /* skip linie */ while(!feof(fp) && fgets(line,sizeof(line),fp)) { x = get_vind(line); if(x < *res) { *res = x; strncpy(retbuf,line,8); retbuf[8] = '\0'; } } }
18. september 2004 - 23:21
#37
hjalp ikke nu skriver den bare det rigtige plus mange under tegn efter:-(
18. september 2004 - 23:30
#38
Hvordan ser filen ud ? Har du sat de linier ind alle de steder hvor der læses fra filen ?
18. september 2004 - 23:36
#39
indholdet at filen er skiftene. for hver 10 sec bliver det skrevet en ny linie.
18. september 2004 - 23:59
#40
Det betyder ikke noget hvis de følger formatet. Spørgsmålet er hvordan de ser ud i toppen.
19. september 2004 - 00:09
#41
samme format hele vejen igennem. like this: 10:10:10,20.20,3030.30,XXX
19. september 2004 - 00:11
#42
Så kan du godt fjerne de 2 ekstra fgets
19. september 2004 - 00:12
#43
Og prøv og giv mig linien og de værdier du får hvor de er forkerte.
19. september 2004 - 00:43
#44
dette viser den ved start: 2.15, 00:15:01fffffrï@÷(\Å-ë@ 15.00, 00:14:2300:15:01fffffrï@÷(\Å-ë@ 801.47, 00:15:0100:14:2300:15:01fffffrï@÷(\Å-ë@ 878.30, 00:13:3800:15:0100:14:2300:15:01fffffrï@÷(\Å-ë@ ---------------------------------------------- efter 4 opdateringer: 1000000.00, 14fffffrï@÷(\Å-ë@ 0.00, 0919.csv300:21:14fffffrï@÷(\Å-ë@ 1000000.00, µÄ20040919.csv00:21:14frï@÷(\Å-ë@ 0.00, , 00:13:3800:21:1400:14:2300:21:14fffffrï@÷(\Å-ë@ ---------------------------------------------- indhold af filen: 00:13:38,14.95,0878.30,N <--den tager den 00:14:23,15.00,0878.30,N <--og den 00:14:33,15.00,0878.30,N 00:14:43,14.95,0878.30,N 00:15:01,02.15,0801.47,N <--og den 00:19:18,15.00,0878.30,N 00:19:28,14.95,0878.30,N 00:19:38,14.95,0878.30,N 00:19:48,14.95,0878.01,N 00:20:46,02.20,0801.47,N 00:21:14,00.25,0800.00,N 00:21:24,14.95,0878.30,N 00:21:34,00.25,0800.00,N
19. september 2004 - 00:47
#45
koden igen igen: double get_vind(char *s) { char *p1, *p2, buf[16]; p1=strchr(s,',') +1; p2=strchr(p1,','); strncpy(buf,p1,p2-p1); buf[p2-p1] = '\0'; return atof(buf); } double get_luft(char *s) { char *p1, *p2, buf[16]; p1=strchr(s,',') +1; p1=strchr(p1,',') +1; p2=strchr(p1,','); strncpy(buf,p1,p2-p1); buf[p2-p1] = '\0'; return atof(buf); } void findmin_vind(char *fnm, double *res, char *retbuf) { double x; char line[200]; FILE *fp; *res = 1000000; fp = fopen(fnm,"r"); while(!feof(fp) && fgets(line,sizeof(line),fp)) { x = get_vind(line); if(x < *res) { *res = x; strncpy(retbuf,line,8); line[8] = '\0'; } } // fclose(fp); } void findmax_vind(char *fnm, double *res, char *retbuf) { double x; char line[200]; FILE *fp; *res = 0; fp = fopen(fnm,"r"); while(!feof(fp) && fgets(line,sizeof(line),fp)) { x = get_vind(line); if(*res < x) { *res = x; strncpy(retbuf,line,8); line[8] = '\0'; } } } void findmin_luft(char *fnm, double *res, char *retbuf) { double x; char line[200]; FILE *fp; *res = 1000000; fp = fopen(fnm,"r"); while(!feof(fp) && fgets(line,sizeof(line),fp)) { x = get_luft(line); if(x < *res) { *res = x; strncpy(retbuf,line,8); line[8] = '\0'; } } } void findmax_luft(char *fnm, double *res, char *retbuf) { double x; char line[200]; FILE *fp; *res = 0; fp = fopen(fnm,"r"); while(!feof(fp) && fgets(line,sizeof(line),fp)) { x = get_luft(line); if(*res < x) { *res = x; strncpy(retbuf,line,8); line[8] = '\0'; } } } void readlog(void) { FILE *stream; char filnavn[50]; struct date d; char val1, val2; double min_vind, max_vind, min_luft, max_luft; char tim1[8],tim2[8],tim3[8],tim4[8]; getdate(&d); sprintf(filnavn,"%4d%02d%02d.csv",d.da_year,d.da_mon,d.da_day); findmin_vind(filnavn, &min_vind, tim1); findmax_vind(filnavn, &max_vind, tim2); findmin_luft(filnavn, &min_luft, tim3); findmax_luft(filnavn, &max_luft, tim4); fclose(stream); gotoxy(44,7); printf("Min:"); gotoxy(62,7); printf("Max:"); gotoxy(37,9); printf("Vind:"); gotoxy(44,9); printf("%02.2f, %s", min_vind, tim1); gotoxy(62,10); printf("%02.2f, %s", max_vind, tim2); gotoxy(37,12); printf("Tryk:"); gotoxy(44,12); printf("%3.2f, %s", min_luft, tim3); gotoxy(62,13); printf("%3.2f, %s", max_luft, tim4); }
19. september 2004 - 01:04
#46
kan ikke mere går i seng nu
19. september 2004 - 09:31
#47
Hov strncpy(retbuf,line,8); line[8] = '\0'; skal være strncpy(retbuf,line,8); retbuf[8] = '\0';
19. september 2004 - 09:32
#48
char tim1[8],tim2[8],tim3[8],tim4[8]; skal være char tim1[9],tim2[9],tim3[9],tim4[9];
19. september 2004 - 21:35
#49
det hjalp lidt nu skriver den det rigtigt til at starte med. Men efter 4 opdateringer ser det således ud: 1000000.00, sv 0.00, 20040919.csv 1000000.00, -źºµÄ20040919.csv 0.00, 21:19:4737
19. september 2004 - 21:37
#50
20040919.csv <-- navnet på filen
19. september 2004 - 21:39
#51
Må jeg se hele koden igen med de sidste rettelser.
20. september 2004 - 08:59
#52
vi har fundet ud af det. det hele virker nu. det sidste der manglede var fclose(fp); i funktionerne. 0x2710 gange tak for hjælpen
Kurser inden for grundlæggende programmering