2010-10-24 6 views
2

Ce que je veux faire est de lire un fichier appelé "test.txt", puis avoir le contenu du fichier est un type const char *. Comment ferait-on cela?fstream pour const char *

+0

Êtes-vous sûr que vous avez besoin d'un '' const char *? Si vous avez besoin de quelque chose pour passer dans une fonction qui prend 'const char *', alors vous pouvez juste passer un 'char *' si c'est plus pratique pour vous. –

+0

duplication possible de [Quelle est la meilleure façon de slurp un fichier dans une chaîne std :: en C++?] (Http://stackoverflow.com/questions/116038/what-is-the-best-way-to-slurp -a-file-into-a-stdstring-in-c) –

Répondre

5
#include <string> 
#include <fstream> 

int main() 
{ 
    std::string line,text; 
    std::ifstream in("test.txt"); 
    while(std::getline(in, line)) 
    { 
     text += line + "\n"; 
    } 
    const char* data = text.c_str(); 
} 

Veillez à ne pas appeler explicitement la suppression des données

+0

serait 'std :: string texte; std :: getline (dans, texte, EOF); const char * data = text.c_str(); 'travailler plus vite? –

+0

Je prévoyais d'ajouter une autre solution qui utilise sstream au lieu de chaîne mais j'ai trouvé la solution par eq-, que je recommande fortement car elle est beaucoup plus efficace car vous allouez et libérez de la mémoire à chaque ligne. –

1

Vous devez:

  1. créer une fonction renvoyant un const char *
  2. ouvrir un fstream sur le fichier
  3. chercher jusqu'à sa fin
  4. déterminer la longueur du fichier en regardant la position du fichier (tell)
  5. cherchent Retour au début
  6. créer un char * pour contenir le contenu du fichier
  7. lire le contenu du fichier dans le char *
  8. retour le pointeur de char *, avec le retour de la fonction en ajoutant le const
  9. le fichier est fermé automatiquement par le fstream sortir du champ
2

Il est peu probable que vous très vraiment envie de le faire. Le contenu du fichier (qui peut être soit du texte, soit des données binaires) ne représentera probablement pas un pointeur (valide) vers un char sur votre architecture, donc il n'est pas vraiment significatif de le représenter comme [const char *]. Au lieu de cela, vous pouvez charger le contenu du fichier en mémoire, puis stocker un pointeur (de type const char *) au début du bloc donné. </pédanterie > Une façon de réaliser que:

#include <sstream> 
#include <fstream> 
// ... 
{ 
    std::ostringstream sstream; 
    std::ifstream fs("test.txt"); 
    sstream << fs.rdbuf(); 
    const std::string str(sstream.str()); 
    const char* ptr = str.c_str(); 
    // ptr is the pointer we wanted - do note that it's only valid 
    // while str is valid (i.e. not after str goes out of scope) 
} 
+0

ne devrait-ce pas être iKlsR

+0

Ouais. Je gâche ça à chaque fois, ce qui est étrange puisque j'apprends habituellement de mes erreurs. (J'utilise rarement les chaînes de caractères, et "chaque fois" je me réfère à la mauvaise en-tête.) Correction. –

Questions connexes