Avatar billede nomak Nybegynder
29. juli 2003 - 22:15 Der er 18 kommentarer og
1 løsning

læse linier i text-fil baglæns?

Som i nok kan se, vil jeg læse en fil så den starter med den sidste linie af filen og slutter med den første..

og så skal den udskrive linien til skærmen med printf..

har leget lidt med fopen og fputs.. men ved ikke hvordan man læser fra en fil, og bestemt ikke bglæns.. :P
Avatar billede arne_v Ekspert
29. juli 2003 - 22:19 #1
Flere muligheder:

1)  læs hele filen fra disk til memory buffer og søg baglæns fra
    slutningen efter '\n'

2)  læs hele filen op fra disk til en data struktur med linierne
    i og så kan du accesse dem direkte

3)  positioner dig og læs fra filen bagfra og frem

Jeg kan godt lave et eksempel, hvis du fortæller hvad du vil have.
Avatar billede nomak Nybegynder
29. juli 2003 - 22:22 #2
tror det må være 3'eren..


altså hvis min fil indeholder

hej
med
dig

skal den udskrive

dig
med
hej
Avatar billede arne_v Ekspert
29. juli 2003 - 22:24 #3
Det vil alle 3 løsninger gøre. De vil bare gøre det på 3 forskellige
måder.
Avatar billede nomak Nybegynder
29. juli 2003 - 22:24 #4
hmm, hvilken en er hurtigst og lettest at bruge?
Avatar billede arne_v Ekspert
29. juli 2003 - 22:25 #5
#1 er lang nemmest men kræver at hele filen kan være i memory.
Avatar billede nomak Nybegynder
29. juli 2003 - 22:27 #6
filen er max 20 linier lang.. så skader det helt vildt?

kunne man ikke evt. cleare det memory den optager?
Avatar billede arne_v Ekspert
29. juli 2003 - 22:29 #7
20 linier = slet ikke noget problem

Hvis de nu var 20 millioner linier, så ...
Avatar billede nomak Nybegynder
29. juli 2003 - 22:30 #8
fint nok.. nr 1 så :D
Avatar billede nomak Nybegynder
29. juli 2003 - 22:31 #9
kan det blive et problem hvis det nu skal gøres flere gange? eller kan man loade det ind i en global variabel til brug flere gange?
Avatar billede arne_v Ekspert
29. juli 2003 - 22:32 #10
Man kan sagtens genbruge memeory.
Avatar billede arne_v Ekspert
29. juli 2003 - 22:38 #11
Her er noget kode:

#include <stdio.h>


int main()
{
  char buffer[1000],line[100],*p1,*p2;
  FILE *fp;
  strcpy(buffer,"");
  fp = fopen("z.dat", "r");
  while(!feof(fp)) {
      fgets(line,sizeof(line),fp);
      strcat(buffer,line);
  }
  fclose(fp);
  p1 = buffer + strlen(buffer);
  while(p1 > buffer) {
      p2 = p1;
      p1--;
      while(p1 >= buffer && *p1 != '\n' ) p1--;
      strncpy(line,p1+1,p2-p1-1);
      line[p2-p1-1] = '\0';
      printf("%s\n",line);
  }
  return 0;
}
Avatar billede arne_v Ekspert
29. juli 2003 - 22:39 #12
Det er bare sådan noget af det kode der er C når det er værst.

Lidt -1 og +1 her og der og hvis de tilfældigvis står rigtigt så
virker det.

Men ihvertfald må det illustrere ideen.

Så kan du jo pynte lidt.
Avatar billede nomak Nybegynder
29. juli 2003 - 22:50 #13
hmm, den spytter sidste linie ud 2 gange..
Avatar billede arne_v Ekspert
29. juli 2003 - 23:02 #14
Hvis den sidste linie er tom skriver den næst sidste linie ud
2 gange.

Jeg kigger på det.
Avatar billede arne_v Ekspert
29. juli 2003 - 23:03 #15
Og det er ikke parsningen der går galt men indlæsningen.
Avatar billede arne_v Ekspert
29. juli 2003 - 23:06 #16
Prøv med den her variant:

#include <stdio.h>

int main()
{
  char buffer[1000],line[100],*p1,*p2;
  FILE *fp;
  strcpy(buffer,"");
  fp = fopen("z.dat", "r");
  while(!feof(fp)) {
      if(fgets(line,sizeof(line),fp)) strcat(buffer,line);
  }
  fclose(fp);
  p1 = buffer + strlen(buffer);
  while(p1 > buffer) {
      p2 = p1;
      p1--;
      while(p1 >= buffer && *p1 != '\n' ) p1--;
      strncpy(line,p1+1,p2-p1-1);
      line[p2-p1-1] = '\0';
      printf("%s\n",line);
  }
  return 0;
}
Avatar billede nomak Nybegynder
29. juli 2003 - 23:10 #17
takker.. lige det jeg manglede :)
Avatar billede dilleberg Nybegynder
29. juli 2003 - 23:20 #18
Et klassisk problem: Først ind, sidst ud.
En klassisk løsning: En stak

#include <stdio.h>
#include <stack>
using namespace std;

int main()
{
  FILE * pFile = fopen("test.txt","rt");
  if (pFile != NULL)
  {
    stack<string> Data;
    char szLine[1000];
    while (fgets(szLine,sizeof(szLine),pFile) != NULL)
      Data.push(szLine);
    fclose(pFile);

    while (! Data.empty())
    {
      const string & strValue = Data.top();
      fputs(strValue.c_str(),stdout);
      Data.pop();
    }
  }

  return 0;
}

db
Avatar billede segmose Nybegynder
30. juli 2003 - 09:40 #19
> db

flot løsning.
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