2 votes

extrait les chiffres du nom de fichier

Je travaille avec des noms de fichiers en C++. J'ai besoin de savoir comment extraire une certaine partie d'un nom de fichier ? Les noms de fichiers sont comme :

/home/xyz/123b45.dat

/home/xyz/012b06c.dat

/home/xyz/103b12d.dat

/home/xyz/066b50.dat

Je veux extraire les deux chiffres après 'b' (45, 06, 12, 50) de chaque nom de fichier et les stocker dans un tableau. Quelqu'un pourrait-il me suggérer comment faire ?

5voto

BoBTFish Points 6610

Utilisation std::string::find y std::string::substr :

int main()
{
    std::string line;
    std::vector<std::string> parts;
    while (std::getline(std::cin, line))
    {
        auto suffix = line.find(".dat");
        if ( suffix != std::string::npos && suffix >= 2)
        {
            std::string part = line.substr(suffix-2, 2);
            parts.push_back(part);
        }
    }

    for ( auto & s : parts )
        std::cout << s << '\n';

    return 0;
}

Nous vous remercions de votre contribution :

$ ./a.out < inp
45
06
12
50

Ou, si vous êtes Absolument sûr chaque ligne est bien formée, vous pourriez remplacer l'intérieur de la boucle par :

std::string part = line.substr(line.size()-6, 2);
parts.push_back(part);

(non recommandé).

Editer : J'ai remarqué que vous aviez changé les critères de la question, voici donc la boucle de remplacement pour les nouveaux critères :

auto bpos = line.find_last_of('b');
if ( bpos != std::string::npos && line.size() >= bpos+2)
{
    std::string part = line.substr(bpos+1, 2);
    parts.push_back(part);
}

Notez que toutes ces variantes ont le même rendement.

Vous pouvez jeter un isdigit pour faire bonne mesure.

Edition finale : Il s'agit de l'intégralité de la bpos version, c++98 compatible :

#include <iostream>
#include <vector>
#include <string>

int main()
{
    std::string line;
    std::vector<std::string> parts;
    // Read all available lines.
    while (std::getline(std::cin, line))
    {
        // Find the last 'b' in the line.
        std::string::size_type bpos = line.find_last_of('b');
        // Make sure the line is reasonable
        // (has a 'b' and at least 2 characters after)
        if ( bpos != std::string::npos && line.size() >= bpos+2)
        {
            // Get the 2 characters after the 'b', as a std::string.
            std::string part = line.substr(bpos+1, 2);
            // Push that onto the vector.
            parts.push_back(part);
        }
    }

    // This just prints out the vector for the example,
    // you can safely ignore it.
    std::vector<std::string>::const_iterator it = parts.begin();
    for ( ; it != parts.end(); ++it )
        std::cout << *it << '\n';

    return 0;
}

0voto

Marc Claesen Points 7203

Compte tenu du titre de votre question, je suppose que vous stockez les noms de fichiers sous forme de vectors de chars . Une bien meilleure façon de procéder serait d'utiliser std::string s. Les chaînes de caractères permettent toutes sortes de fonctions, y compris la symbolisation et la récupération des sous-chaînes et ainsi de suite (c'est ce que vous voulez faire).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X