web-dev-qa-db-fra.com

Lecture de la chaîne par char jusqu'à la fin de la ligne C / C ++

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))

9
user3102621

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.

21
Vaughn Cato

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.

4
Ray Toal

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.

2
Vlad from Moscow

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')

0
ScottMcP-MVP