si la ligne se termine par quelque chose

a marqué ce sujet comme résolu.

Bonjour, j’aimerais lire un fichier de conf en C qui lit ligne par ligne et vérifie qu’elle se termine bien par une suite de caractère bien précise,

mon code marche bien avec des strings, mais pas avec une ligne d’un fichier texte, je soupçonne des caractères spéciaux d’en être la cause (\n, eof ?)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
bool EndWith(const char* haystack, const char* needle)
{
    if (haystack == NULL || needle == NULL)
    {
        return false;
    }
    const char* p;
    if ((p = strstr(haystack, needle)) != NULL)
    {
        if (!strcmp(p, haystack + strlen(haystack) - strlen(needle)))
        {
            return true;
        }
    }
    else
    {
        return false;
    }
    return false;
}
 
 
 
int main(int argc, char **argv)
{
        FILE *file2 = fopen ("config.conf", "r");
        const size_t line_size = 300;
        char* line = malloc(line_size);
        while (fgets(line, line_size, file2) != NULL)  {
            puts(line);
 
            if (EndWith(line, "za"))
            {
                puts("oui");
            }
 
        }
 
 
 
        return 0;
}

mon fichier config.conf :

1
2
3
vm.user_reserve_kbytes = 131072 za
vm.vfs_cache_pressure = 1001 za
vm.zone_reclaim_mode = 01 za

Oui, tu as potentiellement les caractères CR (\r) et/ou (suivant l’OS) LF (\n) à la fin de ton buffer line. Tu peux (r)trimmer la chaîne issue de fgets :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
while (fgets(line, line_size, file2) != NULL)  {
    size_t line_len;

    line_len = strlen(line);
    if ('\n' == line[line_len - 1]) {
        line[--line_len] = '\0';
/*
        // inutile, cf réponse de Taurre
        if ('\r' == line[line_len - 1]) {
            line[--line_len] = '\0';
        }
*/
    } else {
        // la ligne est trop longue pour le buffer ou c'est la dernière
    }
    // la suite de ton code
}

Par rapport à ta fonction EndWith, on peut se passer de strstr :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
bool EndWith(const char* haystack, const char* needle)
{
    if (NULL == haystack || NULL == needle) {
        return false;
    } else {
        size_t haystack_len, needle_len;

        haystack_len = strlen(haystack);
        needle_len = strlen(needle);
        if (needle_len > haystack_len) {
            return false;
        }
        return 0 == strcmp(haystack + haystack_len - needle_len, needle);
    }
}
+1 -0

Salut,

Oui, tu as potentiellement les caractères CR (\r) et/ou (suivant l’OS) LF (\n) à la fin de ton buffer line.

vibrice

Dans le cas où le fichier n’est pas ouvert en mode binaire (option b), la bibliothèque standard se charge de convertir les caractères \n vers la suite de caractères qui va bien et inversément lors de la lecture. Il ne peut donc y avoir que des \n dans le tampons à moins que le fichier ne provienne d’un système différent. ;)

+1 -0

merci, cela fonctionne mieu, mais j’ai par contre encore un probleme pour la dernière ligne. ma fonction endwith ne marche pas avec la dernière ligne (juste avec la dernière)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
int main(int argc, char **argv) {

        FILE *file2 = fopen ("config.conf", "r");
        const size_t line_size = 300;
        char* line = malloc(line_size);
        while (fgets(line, line_size, file2) != NULL)  {
            size_t line_len;

            line_len = strlen(line);
            if ('\n' == line[line_len - 1]) {
                line[line_len--] = '\0';
        /*
                // inutile, cf réponse de Taurre
                if ('\r' == line[line_len - 1]) {
                    line[line_len--] = '\0';
                }
        */
            } else {
                // la ligne est trop longue pour le buffer ou c'est la dernière
            }

            // la suite de ton code
            if(EndWith(line, "za")) {
                puts(line);
            }
        }

        return 0;
}
+0 -0

Sur mon code, il faut remplacer la post-décrémentation (line_len--) par une pré-décrémentation (--line_len) sinon le \n ne sera pas éliminé.

Avec toujours la même implémentation que dans ton premier post ? Un caractère après le "za" ?

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte