Avatar billede tycho Nybegynder
19. december 2003 - 11:05 Der er 13 kommentarer

Indlæs linjer fra fil.

Hej eksperter.
Jeg er ved at skrive et program i C, og jeg skal ha' indlæst nogle linjer fra en .txt fil og sorteret dem.
Jeg har prøvet at oprette et to-dimensionelt array med plads til 100 karakterer for hver linje, men når jeg printf'er indholdet får jeg en masse tegn for enden af filen (Jeg skifter videre til næste indexnummer hver gang jeg støder på \n så arrayet bliver ikke fyldt helt op).
Jeg har eksperienteret lidt med pointers men det har det med at crashe mit program.
Mit spørgsmål er så, er det muligt at indlæse linjerne uden at skulle fylde restdelen af arrayet op med whitespaces? F.eks ved at bruge pointers istedet?
Avatar billede arne_v Ekspert
19. december 2003 - 11:23 #1
Skal du ikke bare holde styr på antallet af linier og lade dine
for løkker løbe til den.
Avatar billede tycho Nybegynder
19. december 2003 - 11:39 #2
Problemet er ikke at indlæse linjerne, men at de skal sorteres og helst være intakte (hvis jeg f.eks laver et array med plads til 100 karakterer, og der er 125 mister jeg de sidste 25, og hvis linjen har 10 karakterer og der er plads til 1024, tjaa, så er der bare lidt for meget plads.
Jeg ved at jeg v.h.a. pointers kan lave arrays med dynamisk størrelse, men da jeg indlæser karakterene fra filen en-for-en, så skal jeg bruge en funktion som ligesom strcpy(), lægger det ind bagerst i filen, men så vidt jeg ved, så virker strcpy() kun ved indexbaserede arrays.
Avatar billede arne_v Ekspert
19. december 2003 - 22:43 #3
strcpy virker fint med pointere også
Avatar billede arne_v Ekspert
19. december 2003 - 22:45 #4
Det nemmeste er at lave et 2D char arrat hvor der er plads til alle
linier og til alle tegn i alle linier og så være ligeglad med spild plads.

Du kan godt dynamisere det med en:

char **lines;

og så først så allokere "antal linier" char* og så for hver af dem
allokere det antal chars der skal til for at holde linien.
Avatar billede arne_v Ekspert
19. december 2003 - 22:45 #5
Sortering må være rimeligt standard sortering.
Avatar billede tycho Nybegynder
19. december 2003 - 22:55 #6
Den crasher hver gang jeg prøver, kunne du komme med et eksempel på hvordan det gøres korrekt?
Avatar billede arne_v Ekspert
19. december 2003 - 23:25 #7
dynamisk allokering eller sortering ?
Avatar billede tycho Nybegynder
19. december 2003 - 23:29 #8
Når jeg bruger strcpy() på en pointer
Avatar billede arne_v Ekspert
19. december 2003 - 23:33 #9
char *p = new char[77];
strcpy(p, "Dette er en prøve");

er et eksempel på noget der virker
Avatar billede tycho Nybegynder
19. december 2003 - 23:40 #10
Det var nu ikke helt det jeg mente.
Med pointers kan man nøjes med at skrive:
char *p;
p = "hello word";
istedet for først at skulle bestemme længden.
Da jeg ved at man også kan oprette arrays på denne måde, ville jeg gerne vide om det er muligt at stoppe en karakter eller en streng ind for enden af pointeren, ligesom man gør med strcpy.
Avatar billede arne_v Ekspert
19. december 2003 - 23:45 #11
char *p = new char[77]; // pointer som peger på dynamisk allokeret plads til 77 chars

char *p = "Dette er en prøve"; // pointer = som peger på den angivne streng som ligger i readonly sektion og derfor ikke kan ændres

Begge er pointere.

Den sidste variant er vel ret uinteressant for dig.
Avatar billede tycho Nybegynder
19. december 2003 - 23:47 #12
Hvis den ikke kan ændres, så er den. Tak for hjælpen.
Avatar billede arne_v Ekspert
19. december 2003 - 23:49 #13
Det pointeren peger på kan ikke ændres.

Pointeren kan sættes til at pege på noget andet.
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