Avatar billede heyn Nybegynder
08. august 2013 - 11:08 Der er 3 kommentarer og
1 løsning

Kan nogen se fejl. Vil følgende loop sikre mig at configurationsfilen HELT sikkert bliver indlæst.

Hej Eksperter.

Jeg anvender Linux.

Jeg har brug for at indlæse en configurationsfil ved programstart.

Men jeg 'mistænker' et andet program for til tider kortvarigt at have sat lock på configurationsfilen.

Vil følgende kode sikre at indlæsningen af configurationsværdierne ikke er "" el. NULL?

Kan nogle se fejl?

Det compiler fint, men det gør det jo ikke fejlfrit :) . Og jeg ved ikke rigtig hvordan jeg skal teste om det fungerer da det andet program kun til tider læser filen.

Hver værdi i configurationsfilen afsluttes med "\n" undtaget den sidste.

_CONF_LINES = antal linier i configurationsfilen (p.t. 40)
char *parr[50]
succesinload = 1 (hvis = 0 fejl i indlæsning)
loop = 0

while (loop < 3){
  for (i = 0; i < _CONF_LINES; i++){ parr[i] = NULL; }
  textfile = fopen("flexdrvconf.txt","r");
  if (textfile!=NULL){
      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 < _CONF_LINES; i++){
        if (parr[i] == NULL || parr[i] == "")) {
            succesinload = 0;
        }   
      }
  }
  if (succesinload == 1) { loop = 3; }
  else {
      loop++;
      sleep(1);
  }
}

Jeg antager at 3 loop med 1 sek. er sikkert.

Venligst Christian
Avatar billede heyn Nybegynder
08. august 2013 - 14:06 #1
Jeg kan sige så meget at hvis en linie er uden indhold "\n" så får jeg "segmentation fault"
Avatar billede segmose Nybegynder
09. august 2013 - 00:55 #2
Du får sikkert segfault fordi strlen == 0 og derfor giver

if (textline[strlen(textline) - 1] == '\n'){
  textline[strlen(textline)-1] = 0;
}
hvilket giver     
if (textline[-1] == '\n'){
  textline[-1] = 0;
}

2 gode muligheder for segfault.
Jeg går ud fra at du har
int  num_of_lines = 0;
og
char textline[117];
et eller andet sted.

Du NULL stiller ikke parr før hvert gennemløb.

Hvis der er et andet program der har gang i den, hvad sker der så hvis du kommer først ...


Test er nemt, lave et andet program der åbner filen og venter til X sec eller du trykker på en knap så den lukker filen igen.

Du starter så dit program medens det første program har den åben.
Avatar billede heyn Nybegynder
09. august 2013 - 20:13 #3
Tak skal du have for forslaget til hvordan jeg kan teste. Det vil jeg gøre.

Smid et svar.

Jeg fandt, efter en del printf af parr og num_of_lines til terminal, mindst en fejl.

Der er sammenbrud ved andet gennemløb når Num_of_lines når 55 hvis en linie mangler el. er blank.

Ikke så underligt. parr er defineret til max. 50.

num_of_lines skal nulstilles ved hvert gennemløb.

Venligst Christian
Avatar billede segmose Nybegynder
10. august 2013 - 01:27 #4
Alle relevante variable skal nulstilles og for purister skal alle pointerer free's og NULL's
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