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 .
Voici les listes de noms de chaîne que je dois lire: p> Mes codes d'origine: p> mes résultats attendus : p>
4 Réponses :
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). P>
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 ( Bien sûr, cela pourrait entraîner des erreurs avec des chaînes de taille variable. P>
Vous pouvez voir Mon exemple P>
edit 2: strong> 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 p>
La ligne que vous recherchez devrait être
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:
Numberase (STD :: Supprimer (Number.begin (), Number.end (), ""), Number.end ()) Code>), alors Je recommande de changer votre ligne substrative. P>
istringingstream (ligne.substr (I, 13)) >> numéro; code> p>
numéro = ligne.substr (i, 14) code>
Vous pouvez également utiliser NOSKIPWS Drapeau à tirer dans WhitSpace, puisque vous sortez après.
Istringstream (Line.Substr (I, 14)) >> STD :: NOSKIPWS >> Numéro; Code> P>
abcdefgh 1ijklmnop 2 ... code> p>
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 code> 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 code> 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.
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
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
@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
@ 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
Avez-vous essayé quelque chose de simple?
std::vector<Name_Value> database; Name_Value nv; while (infile >> nv) { database.push_back(nv); }
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.
J'ai modifié mes codes, alors le problème a été résolu.
Utilisation de Namespace Std; P>
int Main ()
{ p> } p> p>
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 ") code>
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.