Avatar billede arriva Nybegynder
16. december 2003 - 18:46 Der er 8 kommentarer og
1 løsning

Antal linjer i fil

Hey Eksperter!
Er der en hurtig måde, hvorpå man kan finde ud af hvor mange linjer en fil indeholder?

Jeg skal bruge det til at lave et array, som har den størrelse, som der er linjer i filen. Dette skal jeg bruge da jeg har en fil i ren tekst, som ser sådan her ud:
1469275570
200036639
1203882554
63153622
566002842
1604688503
1900018337
526344199
781806482
...

Altså en masse random tal, med et nyt tal på hver linje. Jeg har brugt fscanf til at læse dem ind i et array med, men mangler en måde, hvorpå jeg kan lave arrayet således det passer til mængden af tal.

På forhånd tak!
Avatar billede arne_v Ekspert
16. december 2003 - 18:49 #1
Der er kun en måde at finde antal linier i en fil (på de gængse
platforme): læse hele filen.

Beklager.

Du kan enten læse den 2 gange: første gang for at tælle linier og anden gang
for at læse data - eller bruge en dynamisk struktur til at læse ind
i som f.eks. STL vector.
Avatar billede driis Nybegynder
16. december 2003 - 18:51 #2
Der er ingen anden måde end at læse linjerne én for en for at tælle dem.
Der er så disse 2 (f.eks., der findes naturligvis fler) løsningsmuligheder for dit problem
1) Læs hele filen først og tæl linjerne. Alloker dit array. Læs filen igen, og gem værdierne i dit array.

2) Brug en kædet liste eller lignende. Du kan implementere en selv, eller bruge noget fra standardbibiliotekerne, f.eks. en STL list.
Avatar billede driis Nybegynder
16. december 2003 - 18:52 #3
(Det skal lige siges at jeg ikke havde set arne_v's svar før jeg postede mit eget)
Avatar billede arriva Nybegynder
16. december 2003 - 19:02 #4
Jeg var bange for at det var sådan noget man var nød til...
jeg vil læse filen igennem en gang først for at finde ud af hvor mange linjer den, har og derefter lave arrayet. Følgende giver mig dog problemer, gør jeg det helt forkert?

int t = 0;
long int q;

FILE *fpin;

fpin = fopen("filnavn", "r");

while (q != EOF)
    {
        fscanf(fpin, "%d", &q);
        t++;
    }

printf("%d", t);
Avatar billede arne_v Ekspert
16. december 2003 - 19:07 #5
Ja.

Jeg ville lave det som:

char buf[1000];
while(!feof(fpin)) {
  fgets(buf,sizeof(buf),fpin);
}
Avatar billede arne_v Ekspert
16. december 2003 - 19:11 #6
Jeg skal måske lige forklare:

fscanf(fpin, "%d", &q);

læse tal i tekst form og kan ikke bruges til at detecte EOF med.
Avatar billede arriva Nybegynder
16. december 2003 - 19:12 #7
oh, i see :)
virker nu...
takker!
Avatar billede arriva Nybegynder
16. december 2003 - 19:14 #8
jeg havde lidt på fornemmelsen at det var det, prøvede også med char's, men så læste den jo kun 1 af gangen... tænkte ikke på at fgets stoppede med at læse ved linjeskift..
Avatar billede arne_v Ekspert
16. december 2003 - 19:17 #9
fgets burde hedde fgetline
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