Avatar billede heyn Nybegynder
09. maj 2013 - 11:55 Der er 10 kommentarer og
1 løsning

Hvordan splitter man en tekstfil ind i en struct af char pointere

Hej eksperter

Jeg programmerer C

Jeg er altså ikke helt god til det med char arrays versus char pointere, el. mere precist hvordan man konverterer frem og tilbage mellem dem.

Mit problem er følgende

Jeg har en struct

typedef struct {
  char* en_streng;
  char* en_anden_streng;
  int en_vaerdi;
}

(Og det skal altså meget gerne være char* - ikke char[])

Desuden har jeg en tekstfil som jeg ønsker at dele op i 'stumper' med split på ny linie og placere stumperne i structen.

Jeg kan godt finde ud af at indlæse filen i et midlertidigt
char temparr [50][50].

Men hvordan laver jeg det midlertidige array med pointtekster i stedet?
altså et array[0 - 20] hvor hver plads indeholder en char*.

Christian
Avatar billede arne_v Ekspert
09. maj 2013 - 15:15 #1
Med en pointer allokerer du dynamisk plads og enten henter data til den plads eller kopierer til den plads efter at have hentet.
Avatar billede heyn Nybegynder
09. maj 2013 - 15:54 #2
Men hvordan definerer man et midlertidigt array af char* ?
Avatar billede arne_v Ekspert
09. maj 2013 - 15:59 #3
char s1[4] = "ABC";
char *s2;
s2 = (char*)malloc(strlen(s1)+1);
strcpy(s2, s1);
Avatar billede arne_v Ekspert
09. maj 2013 - 15:59 #4
Men normalt kan du bruge en char[] hvor der forventes en char*.
Avatar billede heyn Nybegynder
09. maj 2013 - 17:04 #5
Hurra - Så lykkedes det hjælp fra dig og mange på nettet som græder over lignende problemer. Smid et svar.
Her er løsningen

#include  <stdio.h>
#include <string.h>
#include <stdlib.h>

char textline[50];
FILE *textfile;
int num_of_lines = 0;
int num_of_char_in_line = 0;
char* pstr = "";
int i;
char ch;
char *parr[20];
size_t len;

int main(void){
  textfile = fopen("splitline.txt","r");
  while ((ch = fgetc(textfile)) != EOF){
      if (ch != '\n'){
        textline[num_of_char_in_line] = ch;
        num_of_char_in_line++;
      }
      else {
        len = strlen(textline);
        parr[num_of_lines] = malloc(len + 1);
        for (i=0;i<len;i++){
            parr[num_of_lines][i] = textline[i];
        }
        parr[num_of_lines][i] = '\0';
        num_of_char_in_line = 0;
        num_of_lines++;
      }
  }
  fclose(textfile);
  for (i=0;i<num_of_lines;i++){
      printf("%s\n",parr[i]);
  }
  return(0);
}
Avatar billede arne_v Ekspert
10. maj 2013 - 02:53 #6
Den kode kan pyntes lidt.

Her er en lidt forsimplet udgave:


#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
    FILE *textfile;
    int i;
    int num_of_lines;
    char textline[50];
    char *parr[20];
    textfile = fopen("splitline.txt", "r");
    num_of_lines = 0;
    while(fgets(textline, sizeof(textline), textfile))
    {
        if(textline[strlen(textline)-1] == '\n') textline[strlen(textline)-1] = 0;
        parr[num_of_lines] = malloc(strlen(textline)+1);
        strcpy(parr[num_of_lines], textline);
        num_of_lines++;
    }
    fclose(textfile);
    for(i = 0; i < num_of_lines; i++)
    {
        printf("%s\n", parr[i]);
    }
    return 0;
}
Avatar billede heyn Nybegynder
10. maj 2013 - 09:56 #7
Rigtigt.

Så mangler svaret bare :)

Lige en ting omkring pointere og memory.
Er der ikke noget om at hvis man bruger malloc på en pointer som allerede har reserveret plads i memory så vil der komme til at 'svæve' skjult reserveret memory rundt i systemet, som i sidste ende kan fylde memory helt op hvis man gør det for mange gange? (hvilket jo ikke er tilfældet i mit eksempel)

Hvis dette er rigtigt - Vil denne 'spøgelses' memory blive dræbt når man lukker programmet?

Med venlig hilsen

Christian
Avatar billede arne_v Ekspert
10. maj 2013 - 17:19 #8
Du skal soerge for at kalde free paa alt du har allokeret med malloc.

Men det bliver automatisk frigivet ved program afslutning (paa alle moderne styresystemer).
Avatar billede arne_v Ekspert
10. maj 2013 - 17:19 #9
svar
Avatar billede heyn Nybegynder
10. maj 2013 - 17:27 #10
Ok - Tak
Avatar billede arne_v Ekspert
12. maj 2013 - 21:15 #11
Naeste trin ville saa vaere at slippe uden om begraensningen paa 20 i:

char *parr[20];
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