2014-09-09 4 views
0

J'essaie de lire à partir d'un fichier texte. Je crois que la syntaxe pour ouvrir un fichier serait:Comment lire à partir d'un fichier texte en C++?

ifstream file("Info.txt"); 
file.open("Info.txt"); 

Si le fichier est formaté comme suit:

Dave Gabe 8 Ryan Green 10

Puis-je créer 3 variables comme si ?

string name; 
    int age; 
    string color; 

Puis lire les informations à partir des fichiers comme ça?

file >> name >> age >> color; 

Comment ce fichier est-il lu affecté par certaines lignes dans les fichiers n'ayant pas l'âge et/ou la couleur?

+1

Vous n'avez pas besoin d'ouvrir le fichier si vous transmettez le nom de fichier dans le constructeur. Si votre fichier texte n'a pas de données correctement formatées sur chaque ligne, vous devrez soit utiliser des séparateurs (comme un fichier CSV), soit vous allez avoir un mauvais moment. – user657267

+0

Je vous suggère de lire tout le fichier et l'enregistrer dans une chaîne std :: string, puis trouver ce que vous voulez dans cette chaîne – nbro

+0

peut-être vous pourriez appeler un appel système qui exécute une commande bash. Utilisez la commande 'cut' pour placer chaque variable sur une ligne distincte dans un nouveau fichier tmp. à partir de C++, lisez le fichier tmp et utilisez getline() pour placer chaque ligne dans une nouvelle variable. – Kam

Répondre

0

Je suis certes pas très familier avec le C++ fonctions de chaîne, mais voici ma tentative:

#include <iostream> 
#include <fstream> 
#include <cstring> 

using namespace std; 

int main() 
{ 
    std::ifstream fin("Info.txt"); 
    if(!fin) 
    { 
      std::cout << "Error opening the file" << std::endl; 
      return(1); 
    } 
    char* line_cstr = new char[1000]; 
    char name[1000]; 
    int age; 
    char color[1000]; 
    char* rest = new char[1000]; 

    fin.getline(line_cstr, 1000); 
    while (strlen(line_cstr) != 0) { 
     int numTokensRead = sscanf(line_cstr, "%s %d %s %1000[0-9a-zA-Z ]s", name, &age, color, rest); 

     if (numTokensRead >= 3 ) { 
     std::cout <<"name: " << name <<", age: " << age <<", color: " << color <<"\n"; 
      strcpy(line_cstr, rest); 
     } 

     // do some error checking for incomplete entries 
     else if (numTokensRead == 1) { 
      if (strlen(name) == strlen(line_cstr)) { 
       // we're done! 
       return 0; 
      } 

      // skip the first token 
      sscanf(line_cstr, "%*s %1000[0-9a-zA-Z ]s", line_cstr); 
     } 
     else if (numTokensRead == 2) { 
      // skip the first 2 tokens 
      sscanf(line_cstr, "%*s %*d %1000[0-9a-zA-Z ]s", line_cstr); 
     } 
    } 
} 

Agissant sur le fichier texte suivant:

Info.txt

Mike 25 Red Dave Gabe 8 Green 10 Green 

sortie

$ ./a.out 
name: Mike, age: 25, color: Red 
name: Gabe, age: 8, color: Green 

Je ne suis pas sûr à 100% que cela gère tous les cas d'erreurs possibles - deux ints d'affilée, un flottant, plusieurs lignes, etc. - mais cela devrait vous aider à démarrer.

Questions connexes