2017-10-17 16 views
0

J'ai ce code:Omet le caractère de saut de ligne dans le fichier de lecture avec C++

#include <iostream> 
#include <string> 
#include <fstream> 

int main() 
{ 
    std::ifstream path("test"); 
    std::string separator(" "); 
    std::string line; 
    while (getline(path, line, *separator.c_str())) { 
     if (!line.empty() && *line.c_str() != '\n') { 
      std::cout << line << std::endl; 
     } 

     line.clear(); 
    } 

    return 0; 
} 

Le fichier « test » est peuplé de nombres, séparés par divers nombre d'espaces. Je dois lire seulement les nombres, un par un et omettre les espaces et les nouvelles lignes. Ce code omet les espaces vides mais pas le caractère de retour à la ligne.

Ce sont quelques lignes du fichier d'entrée « test »:

 3  19  68  29  29  54  83  53 
    14  53  134  124  66  61  133  49 
    96  188  243  133  46  -81  -156  -85 

Je pense que le problème est que cette *line.c_str() != '\n' n'est pas la bonne façon de déterminer si la chaîne line caractère frappé nouvelle ligne et le programme conserve l'impression les nouvelles lignes!

Celui-ci fonctionne très bien:

#include <iostream> 
#include <string> 
#include <fstream> 

int main() 
{ 
    std::ifstream path("test"); 
    std::string separator(" "); 
    std::string line; 
    while (getline(path, line, *separator.c_str())) { 
     std::string number; 
     path >> number; 
     std::cout << number << std::endl; 
    } 

    return 0; 
} 
+0

Au lieu de '* line.c_str() = « \ n'' vous devriez probablement vérifier que la ligne ne contient pas seulement des espaces. Difficile à dire sans voir un exemple de l'entrée (s'il vous plaît faites en sorte que nous puissions voir où se trouvent les caractères '' n'''). – user0042

+1

Vous vérifiez seulement si le premier caractère est le retour à la ligne. Si un nombre est à la fin de la ligne, la nouvelle ligne sera le dernier caractère de 'line', pas le premier caractère. – Barmar

+2

Pourquoi n'utilisez-vous pas 'path >> number;', qui ignorera tout espace et lira un seul nombre. – Barmar

Répondre

1

Utilisez l'opérateur de flux >> lire des entiers:

std::ifstream path("test"); 
int number; 
while(path >> number) 
    std::cout << number << ", "; 
std::cout << "END\n"; 
return 0; 

Ceci listera tous les entiers dans votre fichier, en supposant qu'ils sont séparés par un espace.

L'utilisation correcte pour getline est getline(path, line) ou getline(path, line, ' ') où le dernier argument peut être n'importe quel caractère.

*separator.c_str() dans ce cas convertit en ' '. Cette utilisation n'est pas recommandée.

De même, *line.c_str() indique le premier caractère de line. Pour trouver le dernier caractère, utilisez

if (line.size()) 
    cout << line[size()-1] << "\n"; 

Lorsque vous utilisez getline(path, line), line ne sera pas compris le dernier caractère \n.

Voici un autre exemple avec getline. On lit la ligne de fichiers en ligne, puis convertir chaque ligne stringstream, puis lire les nombres entiers de chaque ligne:

#include <iostream> 
#include <string> 
#include <fstream> 
#include <sstream> 

int main() 
{ 
    std::ifstream path("test"); 
    std::string line; 
    while(getline(path, line)) 
    { 
     std::stringstream ss(line); 
     int number; 
     while(ss >> number) 
      std::cout << number << ", "; 
     std::cout << "End of line\n"; 
    } 
    std::cout << "\n"; 
    return 0; 
} 
1

utiliser la fonction isdigit intégrée dans C++.

+0

Cette fonction prendra-t-elle en compte le signe? – Pekov

+0

non, mais vous pouvez toujours faire un test, isdigit ne filtre que les nombres non numériques. – Lavevel