2017-08-15 5 views
2

Je dispose d'un fichier texte comme celui-cicondition de sortie en boucle sur fgets ne fonctionne pas

"input" 
height : 227 
width : 227 
depth : 3 

"conv" 
num_output : 96 
pad : 0 
kernel_size : 11 
stride : 4 
group : 1 

"relu" 

"pool" 
kernel_size : 3 
stride : 2 

Je lis dans une boucle (ce code est partiel)

char line[100]; 

while ((fgets(line, sizeof(line), filePtr))) { 
    if (line[0] != "\n") { 
     sscanf(line, "%15s : %15s", tmpstr1, tmpstr2); 
     printf("%s\n", tmpstr2); 
     printf("line = %s", line); 
    } else 
     break; 
} 

Mais je remarquai que la condition if détient toujours vrai et la sortie est comme ci-dessous

"input" 
227 
line = height : 227 
227 
line = width : 227 
3 
line = depth : 3 
3 
line = 
3 
line = "conv" 
96 
line = num_output : 96 
0 
line = pad : 0 
11 
line = kernel_size : 11 
4 
line = stride : 4 
1 
line = group : 1 
1 
line = 
1 
line = "relu" 
1 
line = 
1 
line = "pool" 
3 
line = kernel_size : 3 
2 
line = stride : 2 

J'ai essayé comparaison avec \0 ainsi mais le résultat ne change pas. S'il vous plaît pointez-moi où je vais mal.

P.S. : J'utilise Ubuntu 16.04 machine 64 bits avec gcc 5.2.1.

+6

'[0] = "\ n"' -> 'line [0]! = '\ n'' – BLUEPIXY

+3

Vous comparez' char' avec un littéral de chaîne, vous devez activer les avertissements du compilateur. 'gcc' -pedantic -Werror –

+1

@BLUEPIXY Merci de l'avoir signalé. Totalement négligé cette faute de frappe. –

Répondre

5

Newline est un personnage, pas une chaîne, donc changer ceci:

line[0] != "\n" 

à ceci:

line[0] != '\n' 

avertissements de compilateur (-Wall de drapeau dans GCC) et vous devriez voir quelque chose comme ceci:

warning: comparison between pointer and integer 
warning: comparison with string literal results in unspecified behavior [-Waddress] 
4

Vous essayez de comparer un littéral de chaîne avec char.

Avec:

if(line[0] != '\n') 

Il fonctionne bien. Si vous lisez un fichier qui a été ouvert en mode texte (y compris stdin), toute représentation utilisée par le système sous-jacent pour marquer la fin d'une ligne sera traduite en un seul caractère '\ n'.

Vous devez activer les avertissements du compilateur. Pour gcc c'est -pedantic-Werror.

+0

Bonne réponse, mais vérifiez ma réponse pour les drapeaux (j'ai obtenu les avertissements en utilisant un seul drapeau). – gsamaras

+0

Oui, vous le faites, malade laissez-le donc OP verra qu'il ya plus de possibilités pour 'gcc' :-) –

+0

Vous étiez plus rapide et avez une bonne réponse si vous le méritez. –

0

Sur this site nous pouvons voir que fgets ne change pas la valeur de str (ligne dans votre cas). Parce que la valeur ne change pas, votre test if continue d'être évalué à true.

Si vous voulez vérifier si fgets a trouvé la fin du fichier, vous devez vérifier si fgets a retourné NULL.

0

Vous comparez un caractère à une chaîne: line[0] != "\n" doit générer un avertissement. Pour détecter une ligne vide, utilisez ceci:

line[0] != '\n' 

Notez que vous devez également vérifier la valeur de retour de sscanf():

char line[100]; 

while (fgets(line, sizeof(line), filePtr) && *line != '\n') { 
    if (sscanf(line, "%15s : %15s", tmpstr1, tmpstr2) == 2) { 
     printf("%s\n", tmpstr2); 
     printf("line = %s", line); 
    } else { 
     printf("invalid format: %s", line); 
    } 
} 
ligne