-2
votes

Comment C ++ supprime les espaces bloussitaires en chaîne de caractères spécifiques

J'ai un fichier .txt à lire dans mon travail. Chaque chaîne est de 13 caractères de longueur, par ex. "PM 1", que le "PM 1" est de 8 caractères avec 5 espaces blanchisseurs entre "PM" et "1" et il y a 5 espaces blancs derrière "1", par exemple. "DPI 26" est également de 13 caractères, que le "DPI 26" est de 8 caractères avec 2 espaces blanchisseurs entre "dpsi" et "26" et il y a 5 espaces bleus derrière "26". Enfin, je souhaite lire ce fichier et retirer ces espaces entre eux, pour l'exférence, tous les surspaces de "PM 1" sont supprimés, puis obtenez "PM1" et "DPSI 26" est devenu "DPSI26" en supprimant ces blanchissures . mon but ici est: Je souhaite lire ce fichier tous les 13 caractères pour former une chaîne, ce qui signifie que je veux diviser les données de 13 caractères par C ++, puis retirez-la de ces espaces dans cette chaîne, puis produisez 1 d Vecteur de chaîne.

Voici les listes de noms de chaîne que je dois lire: xxx

Mes codes d'origine: xxx

mes résultats attendus : xxx


4 commentaires

Et quels sont vos résultats réels avec ce code?


Si votre résultat diffère de ce que vous attendez, avez-vous essayé de déboguer?


Regex_replace (std :: ostreambuf_iterator (std :: cout), infile.begin (), infileume.end (), "(\ w) \ s * (\ d)", "1 $ 2" $ 2 ")


N ° dans mes codes, en fait, il ne lit que la partie "PM" ou "DPI", et il n'y a pas de numéro 1 ou 26 derrière eux.


4 Réponses :


0
votes

Sans savoir quels sont vos résultats réels, je peux conjecturer en fonction de votre code que vous ne recevez pas les chiffres (le dernier caractère de la chaîne de 13 caractères).

Si tel est le cas, et que vous souhaitez simplement éliminer les espaces blancs de la ligne entière, lisez dans la chaîne de 14 caractères entière, puis enjeunez la blancheur. Si votre mode de fonctionnement existant de ce travail ( Numberase (STD :: Supprimer (Number.begin (), Number.end (), ""), Number.end ()) ), alors Je recommande de changer votre ligne substrative.

istringingstream (ligne.substr (I, 13)) >> numéro;

Bien sûr, cela pourrait entraîner des erreurs avec des chaînes de taille variable.

EDIT: Il n'y a pas de solution possible que vous recevez une chaîne avec toutes les informations souhaitées, car la question doit y résider. En effet, votre code de stripping WhitSpace est correct et fonctionne. Corrigez vos problèmes de sous-chaîne (éteint par X erreurs) et vous êtes bon d'aller

Vous pouvez voir Mon exemple

edit 2: Correction du code pour obtenir 8 caractères puis 5 espaces puis un nombre. Le problème réside toujours dans la sous-chaîne ne recevant pas le nombre

EDIT 3: Votre istringstream ne lit pas dans WhitSpace (selon des commentaires ci-dessous), essayez donc une simple opération d'affectation. Je crois toujours que vous devez vous soustraire de 14 caractères, et voici Un autre exemple .

La ligne que vous recherchez devrait être numéro = ligne.substr (i, 14) Vous pouvez également utiliser NOSKIPWS Drapeau à tirer dans WhitSpace, puisque vous sortez après. Istringstream (Line.Substr (I, 14)) >> STD :: NOSKIPWS >> Numéro;

De plus, vous devrez peut-être mettre à jour l'incrément de la boucle pour la boucle, car vous lisez 14 caractères non 13. Cela suppose bien sûr que juste après le début de la séquence suivante que vous souhaitez retirer. Par exemple, la ligne devrait être similaire à celle-ci: abcdefgh 1ijklmnop 2 ...


10 commentaires

J'ai fait par le change Istringstream (ligne.Substr (I, 13)) >> Number; En tant que suggestions, mais je n'ai toujours reçu que le PM sans chiffres derrière.


Pourquoi ne pas imprimer numéro avant de décaper le blancheur et de voir ce qu'il contient. S'il ne contient pas le numéro, changez la longueur de la sous-chaîne (la 13) jusqu'à ce qu'elle contienne aussi le nombre. C'est probablement une erreur obsolète ou une erreur de comptage (la chaîne entière est supérieure à 13 caractères).


Merci pour votre réponse. Mais je pense que ce n'est pas ce genre d'erreur, car j'ai fait comme vos suggestions. Cela ne fonctionne toujours pas.


String de caractères @ningyili 8, 5 caractères Whitespace = 13 caractères. 1 plus de caractère pour le numéro est une chaîne de 14 caractères. Quelle est la longueur et la sortie du numéro après le substrateur et avant le décapage des espaces blouses? Quelle est la longueur de la ligne et la sortie de la ligne? Il n'est pas très utile de dire "cela ne fonctionne pas" sans fournir d'informations sur ce qui s'est produit. C'est le débogage, essayez d'être robuste dans le test et la collecte d'informations


D'accord, j'utilise le code: Istringstream (ligne.substr (i, 14)) >> numéro dans ma programmation, puis émettez le numéro par COUT, mais il n'abandonne que le PM, PM, PM ... sans nombre, en réalité, Ce dont j'ai besoin, c'est PM1, PM2, PM3 ...


Utilisez COUT pour imprimer toute la ligne maintenant et déterminer où sous la forme de cela. @ JingeyIli Je prendrais votre approche en morceaux, ce qui commence à s'assurer que la ligne dispose des informations que vous souhaitez. Déterminez ensuite quelles informations vous souhaitez sortir de cette ligne et où elle réside. Vous pouvez sous-traiter la ligne deux fois et utiliser la concaténation de la chaîne, vous pouvez prendre tout ce dont vous avez besoin avec une indémogne entre et utilisez des délimiteurs ou quelque chose de similaire pour le dépouiller, etc., puis validez la sortie.


@ Sningyili J'ai édité ma réponse pour fournir un exemple de 13 caractères et un nombre séparé de 5 espaces, je ne vois aucune raison pour que cela ne fonctionne pas avec un 8 caractères si vous tirez dans toute la chaîne, vous souhaitez supprimer les espaces de ( nombre + caractères).


Bonjour, prune 0. Merci beaucoup à vous. Je pense que le problème est dans ces codes: Istringstream (ligne.Substr (I, 13)) >> numéro; Il ne lit que ces caractères avant l'espace, s'il y a une sape à l'intérieur de la chaîne, elle sera arrêtée par l'espace. Alors savez-vous comment puis-je modifier le code pour réaliser mon but?


Vous ne pouvez pas utiliser d'iSTringingStream et définir directement la valeur du nombre à partir du résultat du substrateur. Selon le Documentation , Substr retourne une chaîne. Une simple opération d'affectation est nécessaire. Modification de mon message maintenant pour fournir la ligne que je pense avoir besoin. @Ingyili


Oui, tu as raison. Le problème a été résolu. Merci beaucoup.



0
votes

Vous pouvez utiliser une expression régulière pour cela:

PM1     PM2     PM3     PM4     PM5     PM6
PM7     PM8     PM9     PM10     PM11     PM12
PM13     PM14     PM15     PM16     PM17     PM18
PM19     PM20     PM21     PM22     PM23     PM24
PM25     PM26     PM27     PM28     PM29     PM30
PM31     PM32     PM33     PM34     PM35     PM36
PM37     PM38     PM39     PM40     PM41     PM42
PM43     PM44     PM45     PM46     PM47     PM48
PM49     PM50     PM51     PM52     PM53     PM54
PM55     DPSI1     DPSI2     DPSI3     DPSI4     DPSI5
DPSI6     DPSI7     DPSI8     DPSI9     DPSI10     DPSI11
DPSI12     DPSI13     DPSI14     DPSI15     DPSI16     DPSI17
DPSI18     DPSI19     DPSI20     DPSI21     DPSI22     DPSI23
DPSI24     DPSI25     DPSI26     DPSI27     DPSI28     DPSI29
DPSI30     DPSI31     DPSI32     DPSI33     DPSI34     DPSI35
DPSI36     DPSI37     DPSI38     DPSI39     DPSI40     DPSI41
DPSI42     DPSI43     DPSI44     DPSI45     DPSI46     DPSI47
DPSI48     DPSI49     DPSI50     DPSI51     DPSI52     DPSI53


5 commentaires

Premièrement, merci. Lorsque j'ai compilé vos codes, il y a une erreur: Test-noms.c: 15: 16: Erreur: 'std :: ifstream' {aka 'classe std :: basique_ifstream '} n'a aucun membre nommé "begin '; Voulez-vous dire «mendier»? infile.begin (), ^ ~~~~ bégentifier test-nom.c: 16: 20: ERREUR: 'std :: ios_base :: end' ne peut pas être utilisé comme fonction infileument.end (),


@Ningyili OK, corrigé


Génial. je vous remercie beaucoup. Mais dans mon but, j'ai besoin de lire le fichier et de créer une variable Noms STD :: Vector pour inclure tous ces noms. noms.push_back (numéro);


@ JingeyIli Ce n'est pas une partie de votre question.


D'accord. Si je veux réaliser cet objectif, est-ce que ça va de ces codes: std :: vecteur noms; STD :: COUT << STD :: Regex_replace (ligne, std :: regex ("(\\ w) \\ s * (\\ d)") ")," 1 $ 2 ") << '\ n'; STD :: Numéro de chaîne; istringingstream (ligne) >> numéro; noms.push_back (numéro);



0
votes

Avez-vous essayé quelque chose de simple?

std::vector<Name_Value> database;
Name_Value nv;
while (infile >> nv)
{
    database.push_back(nv);
}


2 commentaires

Merci d'abord. Mais mon but ici est: je veux lire ce fichier tous les 13 caractères pour former une chaîne, ce qui signifie que je veux diviser les données de 13 caractères par C ++, puis supprimer ces espaces dans cette chaîne, puis produire 1 d vecteur de chaîne.


Donner à ma solution un essai. Je crois que cela fonctionnera. Vos données sont principalement séparées de l'espace et vous n'avez pas à vous soucier des colonnes.



1
votes

J'ai modifié mes codes, alors le problème a été résolu.

Utilisation de Namespace Std;

int Main () { xxx

}


0 commentaires