Avatar billede charlie2000 Nybegynder
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.
Avatar billede arne_v Ekspert
18. september 2004 - 15:12 #1
Du finder vel det første komma og det næste komma og snupper tallet mellem
dem !?
Avatar billede charlie2000 Nybegynder
18. september 2004 - 15:13 #2
ja men jeg ved ikke helt hvordan det gøres?
Avatar billede arne_v Ekspert
18. september 2004 - 15:14 #3
Jeg prøver at lave et eksempel
Avatar billede charlie2000 Nybegynder
18. september 2004 - 15:16 #4
takker
Avatar billede arne_v Ekspert
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;
}
Avatar billede charlie2000 Nybegynder
18. september 2004 - 15:24 #6
hvad så hvis jeg har 100 eller 200 linier i den fil?
Avatar billede arne_v Ekspert
18. september 2004 - 15:26 #7
Du skal løbe hele filen igennem og finde den mindste værdi ?
Avatar billede arne_v Ekspert
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;
}
Avatar billede charlie2000 Nybegynder
18. september 2004 - 15:42 #9
kan jeg få dig til at forklare lidt hvad coden gør:-D
Avatar billede arne_v Ekspert
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 */
}
Avatar billede arne_v Ekspert
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;
}
Avatar billede charlie2000 Nybegynder
18. september 2004 - 15:51 #12
jeg prøver lige at få det til at virke:-D
Avatar billede charlie2000 Nybegynder
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);
}
Avatar billede charlie2000 Nybegynder
18. september 2004 - 16:13 #14
det er kun udsnit af den hele kode, det for mangler main funktion og include filerne
Avatar billede arne_v Ekspert
18. september 2004 - 16:14 #15
Så finder den ingen linier.

Formentlig fordi filnavnet er forkert i:

double min = findmin("filnavn");
Avatar billede charlie2000 Nybegynder
18. september 2004 - 16:46 #16
så virker det:-D

mange tak for hjælpen

-=arne_v owner alle c++ programmøre!=-
Avatar billede charlie2000 Nybegynder
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
Avatar billede arne_v Ekspert
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);
}
Avatar billede charlie2000 Nybegynder
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
Avatar billede arne_v Ekspert
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 ?
Avatar billede charlie2000 Nybegynder
18. september 2004 - 18:02 #21
den skal bare være streng - Tak
Avatar billede arne_v Ekspert
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);
Avatar billede charlie2000 Nybegynder
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???
Avatar billede arne_v Ekspert
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);
    ...
  }
Avatar billede charlie2000 Nybegynder
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;
}
Avatar billede arne_v Ekspert
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';
    }
  }
}
Avatar billede charlie2000 Nybegynder
18. september 2004 - 21:52 #27
skal retbuf ikke erkleres og defineres, der ud over siger den at tim never used?
Avatar billede arne_v Ekspert
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';
    }
  }
}
Avatar billede charlie2000 Nybegynder
18. september 2004 - 22:03 #29
klokken er også mange:-D

hvad skal den så kaldes med?
Avatar billede arne_v Ekspert
18. september 2004 - 22:04 #30
double min;
char tim[9];
findmin_vind("noget.fil", &min, tim);
Avatar billede charlie2000 Nybegynder
18. september 2004 - 22:17 #31
nu siger den: Value of type void is not allowed.
Avatar billede arne_v Ekspert
18. september 2004 - 22:18 #32
Hvordan kalder du den ?
Avatar billede charlie2000 Nybegynder
18. september 2004 - 22:19 #33
double min_vind = findmin_vind(filnavn, &min, tim);
Avatar billede arne_v Ekspert
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
Avatar billede charlie2000 Nybegynder
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);
}
Avatar billede arne_v Ekspert
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';
    }
  }
}
Avatar billede charlie2000 Nybegynder
18. september 2004 - 23:21 #37
hjalp ikke nu skriver den bare det rigtige plus mange under tegn efter:-(
Avatar billede arne_v Ekspert
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 ?
Avatar billede charlie2000 Nybegynder
18. september 2004 - 23:36 #39
indholdet at filen er skiftene. for hver 10 sec bliver det skrevet en ny linie.
Avatar billede arne_v Ekspert
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.
Avatar billede charlie2000 Nybegynder
19. september 2004 - 00:09 #41
samme format hele vejen igennem.
like this:

10:10:10,20.20,3030.30,XXX
Avatar billede arne_v Ekspert
19. september 2004 - 00:11 #42
Så kan du godt fjerne de 2 ekstra fgets
Avatar billede arne_v Ekspert
19. september 2004 - 00:12 #43
Og prøv og giv mig linien og de værdier du får hvor de er forkerte.
Avatar billede charlie2000 Nybegynder
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
Avatar billede charlie2000 Nybegynder
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);
}
Avatar billede charlie2000 Nybegynder
19. september 2004 - 01:04 #46
kan ikke mere går i seng nu
Avatar billede arne_v Ekspert
19. september 2004 - 09:31 #47
Hov

    strncpy(retbuf,line,8);
    line[8] = '\0';

skal være

    strncpy(retbuf,line,8);
    retbuf[8] = '\0';
Avatar billede arne_v Ekspert
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];
Avatar billede charlie2000 Nybegynder
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
Avatar billede charlie2000 Nybegynder
19. september 2004 - 21:37 #50
20040919.csv  <-- navnet på filen
Avatar billede arne_v Ekspert
19. september 2004 - 21:39 #51
Må jeg se hele koden igen med de sidste rettelser.
Avatar billede charlie2000 Nybegynder
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
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester