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;
}
5 Réponses :
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';
in c ++ Vous pouvez lire une ligne de fichier par ligne et obtenir directement un Vous trouverez ci-dessous un exemple que j'ai fait avec un strong> p> Fichier de données: EM> P> std :: string code>. Split () Code> Proposition Comme vous l'avez demandé et un Main () CODE> Exemple de lecture d'un fichier: 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;
}
Votre code est trop compliqué et faux.
Vous voulez probablement ceci: p> Ce code est toujours médiocre et aucune vérification liée n'est effectuée. P> Mais de toute façon, vous devriez plutôt le faire la manière C ++ comme suggérée dans les autres réponses. P> P>
Utiliser boost :: Split code>
Vous pouvez faire quelque chose comme ça
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