2013-05-15 5 views
1

Je travaille avec des noms de fichiers en C++. J'ai besoin de savoir comment extraire certaines parties du nom de fichier? noms de fichiers sont comme:extrait les chiffres du nom de fichier

/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 de stocker dans un tableau. Quelqu'un pourrait-il suggérer comment le faire?

+1

Voulez-vous extraire deux chiffres à partir d'un nom de fichier, ou voulez-vous visualiser un vecteur de vecteurs? – juanchopanza

+0

vecteur de vecteurs était une vieille question! cette question concerne le nom de fichier .... @juanchopanza – learner

+0

désolé !! oublié le titre !! @juanchopanza – learner

Répondre

4

Utilisez std::string::find et 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; 
} 

Ouput pour votre entrée:

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

Ou, si vous êtes absolument sûr chaque ligne est bien formé, vous pouvez remplacer l'intérieur la boucle avec:

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

(Non recommandé).

Modifier: J'ai remarqué que vous avez 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); 
} 

noter que toutes ces variations ont la même sortie.

Vous pouvez chuck un isdigit là-dedans pour faire bonne mesure aussi.

modifier final: Ceci est la version complète bpos, 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; 
} 
+0

hey @BoBTFish! Merci beaucoup!! Pourriez-vous s'il vous plaît m'aider avec l'erreur que je reçois ... il dit: "erreur: 'bpos' ne nomme pas un type" Que dois-je faire? merci !!! – learner

+0

Vous ne compilez pas avec le support 'C++ 11'. Si ce n'est pas une option, le type de 'bpos' est' std :: string :: size_type' (c'est pourquoi j'ai utilisé 'auto', il serait facile d'oublier ou d'être paresseux et d'utiliser le mauvais type). – BoBTFish

+0

Je suis en mode C++ 98. Il dit: « erreur: boucles pour base gamme, ne sont pas autorisés en mode C de 98 » Je ne comprends pas ce # ..... Je ne suis pas beaucoup avancé en C++ ... Merci d'aider ... s'il vous plaît suggérer comment implémenter la boucle alors ... – learner

0

Considérant le titre de votre question, je suppose que vous stockez les noms de fichiers comme vectors de chars. Une meilleure façon de le faire serait d'utiliser std::string s. Les chaînes permettent toutes sortes de fonctions d'installation, y compris la segmentation et la récupération des sous-chaînes et ainsi de suite (ce que vous voulez faire).

+0

désolé !!! oublié d'éditer le titre !! c'est sans vecteurs ... @ Marc Claesen – learner