Avatar billede smeltet Nybegynder
27. oktober 2002 - 13:27 Der er 4 kommentarer og
1 løsning

læs og skriv i en fil.....????

C programmering:

Hvordan skriver man altid i starten af en fil, og skubber den allerede eksisterende tekst nedad? Eller, hvordan læser man altid sidste linje i en fil????
Avatar billede arne_v Ekspert
27. oktober 2002 - 14:52 #1
Du kan ikke skubbe data ind i starten af filen. Du bliver
nødt til at lave en ny fil med de nye linier + alle de
gamle linier. Men den nye fil kan naturligvis godt hedde
det samme som den gamle.

Det kan godt være lidt tricky at læse den sidste
linie i en fil, men det kan gøres.

Sidste udvej er naturligvis at læse alle
linierne og den sidste linie inden EOF
er den sidste linie.

Men normalt kan man gøre noget smartere.

F.eks. vil man ofte kunne læse den sidste
store chunk af en fil f.eks. 5 KB og så
søge baglæns efter en linie-separator
(CR LF på DOS, LF på Unix etc.).

Andre gange kan man basere sig på, at
alle records er lige lange. Og så ved
man hvor sidste record starter.

Hvis du selv kontrollerer filens
indhold 100%, så kan du jo skrive i
de 2 sidste bytes et offset til, hvor
sidste record starter.

Så det bør kune lade sig gøre, men den
optimale kode afhænger af:
  - operativ-system
  - filens indhold
  m.v.

Hvis du giver lidt mere info, så vil jerg gerne
prøve at lave et eksempel.
Avatar billede smeltet Nybegynder
27. oktober 2002 - 15:49 #2
OP: Linux
Indhold: LOG

Hey arne_v, det vi gerne vil have op at køre er en fil som logger aktivitet på en server. Denne aktivitet skal så i et givent interval returnere hvad der er sket siden sidste skriv. "puha den er led" Hvis du nu vil have flere point kan du så også svare på hvorledes vi evt. får et program til at opstarte en af de interne processer op i et nyt vindue for sig selv :-))
Avatar billede smeltet Nybegynder
27. oktober 2002 - 15:50 #3
så forhøjer jeg med glæde pointene med 50 minimum :-)
Avatar billede arne_v Ekspert
27. oktober 2002 - 17:00 #4
$ cat z.log
1
22
333
4444
55555
$ cat z.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>

#define N 5120

static char retbuf[1024];

char *get_last_line(char *fnm)
{
  FILE *fp;
  struct stat st;
  char tmpbuf[N];
  int ix,len,bufix;
  stat(fnm, &st);
  len=st.st_size<N?st.st_size:N;
  ix=st.st_size-len;
  fp=fopen(fnm,"rb");
  fseek(fp,ix,SEEK_SET);
  fread(tmpbuf,len,1,fp);
  fclose(fp);
  bufix=len-2;
  while((tmpbuf[bufix]!='\n')&&(bufix>0)) bufix--;
  memcpy(retbuf,tmpbuf+bufix+1,len-bufix-1);
  retbuf[len-bufix-1]='\0';
  return retbuf;
}

int main(int argc,char *argv[])
{
  printf("last line is = %s\n", get_last_line("z.log"));
  exit(0);
}
$ gcc z.c -o z
$ ./z
last line is = 55555
Avatar billede arne_v Ekspert
27. oktober 2002 - 17:04 #5
Dette program viser hvordan det kan gøres.

Jeg vil anbefale jer, at arbejde lidt på at gøre
programmet mere robust førend i tager det i seriøs
brug.

Og husk, at det bygger på en forudsætning om at
man kan åbne en text fil som binær fil og finde
records via delimiter '\n'. Det gælde for Unix.
Men ikke nødvendigvis på andre platforme.

DOS er dog ret nem at konvertere til da man bare skal
bruge \r\n i.s.f. \n.
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