Comment lire une chaîne un caractère à la fois et s'arrêter lorsque vous atteignez la fin de la ligne? J'utilise la fonction fgetc pour lire à partir du fichier et mettre les caractères dans le tableau (ce dernier changera le tableau en malloc), mais je ne peux pas comprendre comment arrêter lorsque la fin de la ligne est atteinte
J'ai essayé ceci (c est la variable avec char du fichier):
if(c=="\0")
Mais cela donne une erreur que je ne peux pas comparer le pointeur à l'entier
Le fichier ressemble (la longueur des mots est inconnue):
one
two
three
Voici donc les questions: 1) Puis-je comparer c avec\0 car\0 est deux symboles (\ et 0) ou est-ce compté comme un (même question avec\n) 2) Peut-être devrais-je utiliser\n? 3) Si les suggestions ci-dessus sont erronées, que suggéreriez-vous (notez que je dois lire la chaîne un caractère à la fois)
(Notez que je suis assez nouveau en C++ (et que je le programme moi-même))
Vous souhaitez utiliser des guillemets simples:
if(c=='\0')
Les guillemets doubles (") sont pour les chaînes, qui sont des séquences de caractères. Les guillemets simples (') sont pour les caractères individuels.
Cependant, la fin de ligne est représentée par le caractère de nouvelle ligne, qui est "\ n".
Notez que dans les deux cas, la barre oblique inverse ne fait pas partie du caractère, mais juste une façon de représenter des caractères spéciaux. En utilisant des barres obliques inverses, vous pouvez représenter divers caractères non imprimables et également des caractères qui pourraient autrement perturber le compilateur.
La réponse à votre question d'origine
Comment lire une chaîne un caractère à la fois et s'arrêter lorsque vous atteignez la fin de la ligne?
est, en C++, très simplement, à savoir: use getline . Le lien montre un exemple simple:
#include <iostream>
#include <string>
int main () {
std::string name;
std::cout << "Please, enter your full name: ";
std::getline (std::cin,name);
std::cout << "Hello, " << name << "!\n";
return 0;
}
Voulez-vous vraiment faire ça en C? Je ne le ferais pas! La chose est, en C, vous devez allouer la mémoire dans laquelle placer les caractères que vous lisez? Combien de personnages? Vous ne savez pas à l'avance. Si vous allouez trop peu de caractères, vous devrez à chaque fois allouer un nouveau tampon pour vous rendre compte que vous lisez plus de caractères que vous n'en avez prévu. Si vous sur-allouez, vous perdez de l'espace.
C est un langage de programmation de bas niveau. Si vous êtes nouveau dans la programmation et l'écriture d'applications simples pour lire des fichiers ligne par ligne, utilisez simplement C++. Il fait toute cette allocation de mémoire pour vous.
Vos questions ultérieures concernant "\0"
et la fin des lignes en général ont été répondues par d'autres et s'appliquent aussi bien au C qu'au C++. Mais si vous utilisez C, n'oubliez pas que ce n'est pas seulement la fin de ligne qui compte, mais aussi l'allocation de mémoire. Et vous devrez faire attention à ne pas surcharger votre tampon.
Si vous utilisez la fonction C fgetc
, vous devez vérifier un caractère suivant s'il est égal au nouveau caractère de ligne ou à EOF. Par exemple
unsigned int count = 0;
while ( 1 )
{
int c = fgetc( FileStream );
if ( c == EOF || c == '\n' )
{
printF( "The length of the line is %u\n", count );
count = 0;
if ( c == EOF ) break;
}
else
{
++count;
}
}
ou il serait peut-être préférable de réécrire le code en utilisant la boucle do-while. Par exemple
unsigned int count = 0;
do
{
int c = fgetc( FileStream );
if ( c == EOF || c == '\n' )
{
printF( "The length of the line is %u\n", count );
count = 0;
}
else
{
++count;
}
} while ( c != EOF );
Bien sûr, vous devez insérer votre propre traitement des caractères x lus. Ce n'est qu'un exemple d'utilisation de la fonction fgetc
pour lire les lignes d'un fichier.
Mais si le programme est écrit en C++, il serait préférable d’utiliser std::ifstream
et std::string
classes et fonction std::getline
pour lire une ligne entière.
Un fichier texte n'a pas\0 à la fin des lignes. Il a\n.\n est un caractère, pas une chaîne, il doit donc être placé entre guillemets simples
si (c == '\ n')