À l'aide de C++ ifstream extraction de l'opérateur>> pour lire les données formatées à partir d'un fichier
Que mon apprentissage, je suis en train d'utiliser le c++ ifstream et de son opérateur>> lire des données à partir d'un fichier texte à l'aide du code ci-dessous. Le fichier texte outdummy.txt a contenu suivant:
just dummy
Hello ofstream
555
Ma questions est de savoir comment lire char données présentes dans le fichier dans un tableau de char ou de la ficelle. Comment faire cela en utilisant la ifstream::operator>> dans le code ci-dessous.
#include <iostream>
#include <fstream>
int main()
{
int a;
string s;
char buf[100];
ifstream in("outdummy.txt",ios_base::in);
in.operator>>(a); //How to read integer? How to read the string data.??
cout << a;
in.close();
getchar();
return 0;
}
Votre exemple est mauvais, vous n'avez même pas "lire l'entier correctement". En fait, cette ligne échoue et
est droit. Et il provided la bonne et facile à utiliser la solution -- le
Pourquoi
Mon commentaire a été largement rhétorique. 🙂
SB - Mon mauvais. désolé
a
est inchangé, mais pour une raison quelconque vous déjà initialisé à la valeur attendue, si vous avez les yeux bandés vous-même.est droit. Et il provided la bonne et facile à utiliser la solution -- le
getline
avec string
.Pourquoi
char[]
? Pourquoi ne pas std::string
?Mon commentaire a été largement rhétorique. 🙂
SB - Mon mauvais. désolé
OriginalL'auteur goldenmean | 2011-09-16
Vous devez vous connecter pour publier un commentaire.
Si vous souhaitez utiliser formaté d'entrée, vous devez savoir à l'avance quelles sont les données à attendre et de le lire dans les variables de la fonction de type de données. Par exemple, si vous savez que le nombre est toujours la cinquième jeton, comme dans votre exemple, vous pourriez faire ceci:
D'autre part, si vous savez que le nombre est toujours sur la troisième ligne, par lui-même:
Comme vous pouvez le voir, à lire un jeton comme une chaîne de caractères, vous venez de le diffuser dans un
std::string
. Il est important de se rappeler que la mise en forme d'entrée de l'opérateur travaille jeton par jeton, et les jetons sont séparés par des espaces (espaces, tabulations, retours à la ligne). L'habituel choix fondamental à faire est de savoir si le traitement d'un fichier entièrement en jetons (première version), ou ligne par ligne (deuxième version). Pour ligne-par-ligne de traitement, vous utilisezgetline
premier à lire une seule ligne dans une chaîne de caractères, et ensuite utiliser une chaîne de stream pour marquer la chaîne.Un mot sur la validation: Vous ne pouvez pas savoir si un formatée extraction réussiront vraiment, parce que cela dépend de l'entrée de données. Par conséquent, vous devez toujours vérifier si une opération d'entrée réussi, l'abandon et l'analyse si elle n'est pas, car en cas de panne de vos variables ne contiennent pas les données correctes, mais vous n'avez aucun moyen de savoir que plus tard. Il faut donc toujours à dire comme ceci:
La dernière construction est généralement utilisé dans un
while
boucle, pour lire l'intégralité d'un fichier ligne par ligne:OriginalL'auteur Kerrek SB
ifstream
aios_base::in
par défaut. Vous n'avez pas besoin de le spécifier.operator>>
peut être directement invoquée comme un opérateur:in >> a
.in >> s
, mais le problème, c'est qu'il est blanc, délimité, de sorte qu'il sera lu "juste" par lui-même, sans "dummy".std::getline(in, s)
.OriginalL'auteur Marcelo Cantos
Depuis que vous avez choisi d'utiliser C-strings, vous pouvez utiliser le getline méthode de votre
ifstream
objet (passtd::getline()
qui fonctionne avecstd::string
s), ce qui vous permettra de spécifier le C-string et d'une taille maximale de la mémoire tampon.Basé sur ce que vous aviez, et l'ajout d'un tampon supplémentaire pour la deuxième ligne:
Toutefois, comme les autres affiches a proposé, essayez d'utiliser le
std::string
et de ses méthodes, il rendra votre vie plus facile.Prêche à des convertis, mais je vais essayer de l'adapter à son exemple.
juste assez, mais je pense que si quelqu'un suggère
in.operator>>(a)
en premier lieu, il est temps pour un changement de vêtements 🙂- Vous sérieux? 🙂 Mais remarque qu'il n'a pas de travail. L'erreur a été obscurci parce que l'OP n'a pas de valider la valeur de retour.
OriginalL'auteur jonsca
Vous pouvez lire le contenu du fichier et utiliser un La Machine À État Fini pour l'analyse.
Exemple:
Alternativement, vous pouvez utiliser un outil comme Flex à l'écriture de votre analyseur.
std::string
?J'ai utilisé un allouée dynamiquement char tableau pour être cohérent avec l'exemple inclus dans la question. Bien sûr, il serait plus adéquat d'utiliser un conteneur comme
string
,rope
ouvector<char>
au lieu d'un tableau de char dans la production de code et je l'ai mentionné.La question n'a pas allouer dynamiquement un
char
tableau.OriginalL'auteur npclaudiu