Avatar billede heyn Nybegynder
08. maj 2013 - 09:43 Der er 8 kommentarer og
1 løsning

Hvordan splitter man en multiline textfil ind i et array

Hej Eksperter

Jeg har en tekstfil conf.txt der indeholder forskellige oplysninger om konfigurationen af mit program. Hver oplysning sin linie.

Hvordan læser man teksten ind i et array af strenge hvor ny linie splitter.

I PHP ville jeg bare indlæse filen og anvende noget i stil med explode.

Men hvordan med C? Både indlæsning og splitning giver mig problemer.

Christian
Avatar billede heyn Nybegynder
08. maj 2013 - 12:29 #2
Hvordan definerer man et array af string pointers når man ikke ved i forvejen hvor store el. hvor mange strengene er?
Avatar billede bufferzone Praktikant
08. maj 2013 - 12:37 #3
Uden at have tænkt det fuldstændigt igennem, men hvad med at gennemføre funktionen i to iterationer.

Første run definerer arrayet, næste run populerer det.
Avatar billede heyn Nybegynder
08. maj 2013 - 14:50 #4
Jeg fik vist ikke udtrykt spørgsmålet helt klart. Det er en tekst fra en fil der skal indlæses i et array.

Jeg nåede frem til følgende løsning:

#include  <stdio.h>

//char text[1000 + 1]; // Tekstfil maa max have 1000 karakterer. 1001 = EOF
char textline[50];
char textlinearr[50][50];
FILE *textfile;
int num_of_lines = 0;
int num_of_chars = 0;
int num_of_char_in_line = 0;
int i;
int ch;

int main(void){
   
  textfile = fopen("splitline.txt","r");
  while ((ch = fgetc(textfile)) != EOF){
    if (ch != '\n'){
      textlinearr[num_of_lines][num_of_char_in_line] = ch;
      num_of_chars++;
      num_of_char_in_line++;
    }
    else {
      num_of_char_in_line = 0;
      num_of_lines++;
    }
  }
  printf("Number of caracters = %d including space and new line caracters\n",num_of_chars);
  printf("Number of lines = %d\n",num_of_lines);

  return(0);
}

Christian
Avatar billede heyn Nybegynder
08. maj 2013 - 14:51 #5
Ps Der er 'finere' løsninger med komplicerede char* arrays men det havde jeg ikke tid til :)
Avatar billede heyn Nybegynder
08. maj 2013 - 14:52 #6
PPS Og husk fclose()
Avatar billede arne_v Ekspert
08. maj 2013 - 15:28 #7
C eller C++ ?

I C++ kan du bare bruge en vector<string> til at gemme alle linier - baade vector og string er dynamiske med laengde.

I C vil det kraeve lidt mere.

En mulighed er et 2D array med dimensioner MAX_LINES x MAX_LINELENGTG.

En anden mulighed er en double linked list af linier som allokeres udfra linie laengden (fgets er nok bedre end fgetc).
Avatar billede arne_v Ekspert
09. maj 2013 - 03:51 #8
C++ snippet:


    vector<string> all;
    ifstream f("noget.dat");
    while(!f.eof() && f)
    {
        string line;
        getline(f,line);
        all.push_back(line);
    }
Avatar billede arne_v Ekspert
09. maj 2013 - 03:54 #9
C snippet:


  FILE *fp;
  fp = fopen("noget.dat", "r");
  while(fgets(line,sizeof(line),fp))
  {
        /* brug line */
  }
  fclose(fp);
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