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 tema
Offentlig digitalisering
Fra effektivisering til digital suverænitet. Hvordan skaber det offentlige en digital fremtid med AI, sikkerhed og kontrol i centrum?
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