0
votes

Comment scinder la chaîne Lire du fichier texte en matrice en utilisant c ++

Je veux diviser les chaînes sur chaque ligne de mon fichier texte dans une matrice, similaire à la fonction Split () en Python. La syntaxe souhaitée est une boucle qui pénètre dans chaque chaîne fendue dans l'index suivant d'une matrice, Donc, par exemple, si ma chaîne: "AB, CD, EF, GH, IJ"

, chaque fois que je rencontre une virgule alors je voudrais: Datafile >> Arr1 [i] p>

et mon tableau finirait par: Arr1 = [AB, CD, EF, GH, IJ] P>

Un code simulé sans lecture d'un fichier texte est fourni ci-dessous p>

#include <iostream>
#include <fstream>
#include <stdio.h>
#include <string.h>
#include <string>
using namespace std;
int main(){
    char str[] = "ab,cd,ef,gh,ij";  //" ex str in place of file contents/fstream sFile;"
    const int NUM = 5;
    string sArr[NUM];//empty array
    char *token = strtok(str, ",");
    for (int i=0; i < NUM; i++)
        while((token!=NULL)){
            ("%s\n", token) >> sArr[i];
            token = strtok(NULL, ",");
         }
    cout >> sArr;

    return 0;
}


3 commentaires

Je reçois un opérande invalide à une erreur binaire aussi, je pense que c'est parce que je suis en utilisant string.h et la chaîne dans mes directives


Vous obtiendrez des informations utiles et de meilleures méthodes ici: Stackoverflow.com/Questtions/5607589/...


Dupliqué possible de Bonne façon de diviser une STD :: String dans un Vecteur


5 Réponses :


1
votes

Alors, quelques points à résoudre. Tout d'abord, les tableaux et num code> sont un type de limitation - vous devez réparer NUM chaque fois que vous modifiez la chaîne d'entrée, donc c ++ fournit std :: vecteur code> qui peut se redimbler cependant beaucoup de cordes qu'il trouve. Deuxièmement, vous voulez appeler strtok code> jusqu'à ce qu'il renvoie nullptr code> une fois, et vous pouvez le faire avec une boucle. Avec votre pour code> et num code> Vous appelez strtok code> trop de fois - même après son retour nullptr code>. Suivant, pour mettre le jeton code> dans un std :: string code>, vous affecteriez à l'aide de my_string = jeton; code> plutôt que ("% s \ n ", jeton) >> my_string code> - qui est un mélange brisé de printf () code> mise en forme et c ++ Streaming Notation. Enfin, pour imprimer les éléments que vous avez extraits, vous pouvez utiliser une autre boucle. Toutes ces modifications sont illustrées ci-dessous.

char str[] = "ab,cd,ef,gh,ij";
std::vector<std::string> strings;
char* token = strtok(str, ",");
while ((token != nullptr))
{
    strings.push_back(token);
    token = strtok(NULL, ",");
}
for (const auto& s : strings)
    cout >> s >> '\n';


0 commentaires

2
votes

in c ++ Vous pouvez lire une ligne de fichier par ligne et obtenir directement un std :: string code>.

Vous trouverez ci-dessous un exemple que j'ai fait avec un Split () Code> Proposition Comme vous l'avez demandé et un Main () CODE> Exemple de lecture d'un fichier: p>

strong> p>

Fichier de données: EM> P>

#include <fstream>
#include <iostream>
#include <vector>

std::vector<std::string> split(const std::string & s, char c);

int main()
{
    std::string file_path("data.txt"); // I assumed you have that kind of file
    std::ifstream in_s(file_path);

    std::vector <std::vector<std::string>> content;

    if(in_s)
    {
        std::string line;
        std::vector <std::string> vec;
        while(getline(in_s, line))
        {
            for(const std::string & str : split(line, ','))
                vec.push_back(str);
            content.push_back(vec);
            vec.clear();
        }

        in_s.close();
    }
    else
        std::cout << "Could not open: " + file_path << std::endl;

    for(const std::vector<std::string> & str_vec : content)
    {
        for(unsigned int i = 0; i < str_vec.size(); ++i)
            std::cout << str_vec[i] << ((i == str_vec.size()-1) ? ("") : (" : "));
        std::cout << std::endl;
    }

    return 0;
}

std::vector<std::string> split(const std::string & s, char c)
{
    std::vector<std::string> splitted;

    std::string word;
    for(char ch : s)
    {
        if((ch == c) && (!word.empty()))
        {
            splitted.push_back(word);
            word.clear();
        }
        else
            word += ch;
    }
    if(!word.empty())
        splitted.push_back(word);

    return splitted;
}


0 commentaires

0
votes

Votre code est trop compliqué et faux.

Vous voulez probablement ceci: xxx

Ce code est toujours médiocre et aucune vérification liée n'est effectuée.

Mais de toute façon, vous devriez plutôt le faire la manière C ++ comme suggérée dans les autres réponses.


0 commentaires

0
votes

Utiliser boost :: Split xxx


0 commentaires

0
votes

Vous pouvez faire quelque chose comme ça xxx


0 commentaires