C++ Lecture de mots à partir d'un fichier texte, mot par mot ou char par char
J'ai cherché sur google et autour de la lecture par le biais de mon livre et d'essayer d'écrire le code pour lire un fichier texte et le processus des mots, un par un, afin que je puisse les mettre dans l'ordre alphabétique et de garder un décompte du nombre de mots utilisés et bien un mot a été utilisé. Je n'arrive pas à obtenir mon GetNextWord() fonctionne correctement et c'est me rend fou.
J'ai besoin de lire les mots, un par un, et de convertir chaque lettre en minuscule s'il est en majuscules. Qui je sais comment le faire, et l'ont fait avec succès. C'est juste à passer le mot, caractère par caractère et de le mettre dans une chaîne qui m'.
C'est mon plus récent essayer: Toute aide serait étonnant ou un lien vers un tutoriel sur la façon de lire à partir d'un fichier d'entrée de mot en mot. (Le mot en caractères alphabétiques (a-z et ' (ne pas) se sont terminées par des espaces, des virgules, période de, ; , : , ect....
void GetNextWord()
{
string word = "";
char c;
while(inFile.get(c))
{
while( c > 64 && c < 123 || c == 39)
{
if((isupper(c)))
{
c = (tolower(c));
}
word = word + c;
}
outFile << word;
}
}
Aussi, placer entre crochets dans votre, tandis que les conditions à définir clairement.
Ne t utiliser des numéros de magie, ils ne sont pas portables. L'utilisation de 'A' ou 'Z' ou quoi que 39 est censé être.
Apprendre à utiliser un débogueur, ou mettre
std::cout << "c " << (int)c << '\n';
, std::cout << "word is now '" << word << "'\n";
etc à l'intérieur de votre fonction, de sorte que vous pouvez voir chaque étape, c'est prenant. Compétences de résolution des problèmes sont beaucoup plus importantes qu'une réponse à cette question.Le fichier contient les mots à mots (sens des mots qui vont partout des sauts de lignes)?
OriginalL'auteur MSwezey | 2010-09-15
Vous devez vous connecter pour publier un commentaire.
Votre logique est faux. L'intérieur de la boucle s'exécute tant que
c
ne change pas, et il n'y a rien à changer lesc
.Pourquoi êtes-vous d'avoir deux boucles de toute façon? Je pense que vous pourriez être confus quant à savoir si cette fonction est censé lire le mot suivant ou tous les mots. Essayez de séparer ces préoccupations, les mettre dans des fonctions différentes (l'une appelant l'autre). Je trouve qu'il est plus facile d'aborder ces problèmes dans un ordre de haut en bas:
Maintenant combler les lacunes en définissant
GetNextWord()
de tout lire jusqu'à la prochaine frontière de mot.Merci!!!! fonctionne comme un charme!
OriginalL'auteur sbi
Vous pouvez lire le fichier word en word en utilisant la
>>
de l'opérateur. Par exemple, voir ce lien: http://www.daniweb.com/forums/thread30942.html.J'ai extrait de leur exemple ici:
OriginalL'auteur Scott Stafford
Personnellement, j'aime lire en entrée avec
std::getline(std::istream&, std::string&)
(dans le<string>
en-tête, mais vous aurez bien sûr besoin aussi de#include
un flux de données d'en-tête).Cette fonction pauses sur la nouvelle ligne, qui est les espaces par votre problème de définition. Mais ce n'est pas la totalité de la réponse à votre question. Après la lecture de la ligne de texte, vous allez avoir besoin d'utiliser opérations de la chaîne ou des algorithmes standard de briser la chaîne de caractères en mots. Ou vous pourriez en boucle sur la chaîne à la main.
Le courage serait quelque chose comme:
Un mot coupé comme "back-scatter" n'a pas d'importance, tant que le problème spec définit si c'est compté comme un seul mot ou deux. Cependant, si je comprends Space_C0wb0y correctement, les mots qui sont un trait d'union à continuer sur la ligne suivante aurait besoin de plus logique que ce que j'ai indiqué. Étant donné que ce programme ressemble beaucoup à des devoirs, je doute que se soit d'entrée valide, mais si c'est le cas, il serait nécessaire de gérer une telle entrée.
OriginalL'auteur Max Lybbert
- Je utiliser
Je ne suis pas sûr que cela est particulièrement utile pour vous, mais je vais essayer. La fonction toLower est un moyen rapide de fonction qui utilise simplement l' ::toLower() fonction. Ce lit chaque char jusqu'à ce qu'un espace, puis l'enfourne dans un vecteur. Je ne suis pas entièrement sûr de ce que tu veux dire avec char par char.
Voulez-vous extraire un caractère de mot par un temps? Ou voulez-vous de vérifier chaque personnage comme vous allez le long? Ou voulez-vous dire que vous voulez extraire un mot, de finition, et de revenir ensuite? Si oui, je voudrais 1) de recommander un vecteur de toute façon, et 2) faites le moi savoir afin que je puisse refactoriser le code.
OriginalL'auteur IAE
Ce qui va mettre fin à votre intérieur de la boucle, si c == 'a'? La valeur ASCII de 'a' est de 97.
OriginalL'auteur Andrew Bainbridge