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
Annonceindlæg fra Arctic Wolf
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.
tror det må være 3'eren.. altså hvis min fil indeholder hej med dig skal den udskrive dig med hej
Det vil alle 3 løsninger gøre. De vil bare gøre det på 3 forskellige måder.
hmm, hvilken en er hurtigst og lettest at bruge?
#1 er lang nemmest men kræver at hele filen kan være i memory.
filen er max 20 linier lang.. så skader det helt vildt? kunne man ikke evt. cleare det memory den optager?
20 linier = slet ikke noget problem Hvis de nu var 20 millioner linier, så ...
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?
29. juli 2003 - 22:32
#10
Man kan sagtens genbruge memeory.
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; }
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.
29. juli 2003 - 22:50
#13
hmm, den spytter sidste linie ud 2 gange..
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.
29. juli 2003 - 23:03
#15
Og det er ikke parsningen der går galt men indlæsningen.
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; }
29. juli 2003 - 23:10
#17
takker.. lige det jeg manglede :)
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
30. juli 2003 - 09:40
#19
> db flot løsning.
Kurser inden for grundlæggende programmering