Fonction compte sous unix

diaz -  
mamiemando Messages postés 34245 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,

J'aimerai créer une fonction sous unix qui joue le role d'un compteur,c'est à dire qu'à chaque fois que je vais apeler la fonction ,elle doit me retourner la valeur incrementé de 1 sachant que la valeur initiale sera 0.

Merci d'avance.

1 réponse

mamiemando Messages postés 34245 Date d'inscription   Statut Modérateur Dernière intervention   7 899
 
1) Si quand tu dis "appeler une fonction", la dite fonction est contenue dans un programme et appelée plusieurs fois dans ce programme, ce que tu cherches s'appelle un variable statique (en C et en C++).

2) S'il s'agit d'un script ou d'un programme, appelé par un autre programme, le plus simple (et la seule solution que je vois comme ça à froid) c'est de stocker la valeur dans un fichier que ta fonction va incrémenter.

Exemple en C++ :

1) Avec des variables statiques :
#include <iostream>

void f(){
    static unsigned i = 0;
    std::cout << i++ << std::endl;
}

int main(){
    f();
    f();
    f();
    f();
    return 0;
}

ce qui donne à l'exécution :
0
1
2
3

2) Via un fichier :
#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>

int main(){
    const char *filename = "compteur.txt";
    std::ifstream ifs(filename);
    unsigned compteur = 0;

    // Lire le fichier compteur s'il existe
    if(ifs){
        std::string s;
        if(std::getline(ifs,s)){
            if((sscanf(s.c_str()," %i ",&compteur)) != 1){
                std::cerr << "invalid file " << filename << std::endl;
                return 2;
            }
        }else{
            std::cerr << "invalid file " << filename << std::endl;
            return 2;
        }
        ifs.close();
    }

    // Mettre à jour le fichier compteur
    std::ofstream ofs(filename);
    if(!ofs){
        std::cerr << "can't open " << filename << std::endl;
        return 1;
    }
    ofs << compteur + 1 << std::endl;
    ofs.close();
    return 0;
}

À l'exécution :
(mando@aldur) (~) $ g++ plop.cpp
(mando@aldur) (~) $ cat compteur.txt
cat: compteur.txt: Aucun fichier ou répertoire de ce type
(mando@aldur) (~) $ ./a.out
(mando@aldur) (~) $ cat compteur.txt
1
(mando@aldur) (~) $ ./a.out
(mando@aldur) (~) $ cat compteur.txt
2
(mando@aldur) (~) $ ./a.out
(mando@aldur) (~) $ cat compteur.txt
3

Bonne chance
0