2011-08-13 4 views
2

J'essaye de lire un fichier et de sortir le contenu. Tout fonctionne bien, je peux voir le contenu mais il semble ajouter environ 14 octets vides à la fin. Est-ce que quelqu'un sait ce qui ne va pas avec ce code?C++ Ifstream lit trop?

    int length; 
        char * html; 


        ifstream is; 
        is.open ("index.html"); 
        is.seekg (0, ios::end); 
        length = is.tellg(); 
        is.seekg (0, ios::beg); 
        html = new char [length]; 

        is.read(html, length); 
        is.close(); 
        cout << html; 
        delete[] html; 

Répondre

5

C'est parce que html n'est pas une chaîne vide terminé, et std::cout conserve le caractère d'impression jusqu'à ce qu'il trouve \0, ou il peut se bloquer votre programme

Faites ceci:

html = new char [length +1 ]; 

is.read(html, length); 
html[length] = '\0'; // put null at the end 
is.close(); 
cout << html; 

Ou, vous pouvez le faire:

cout.write(html, length); 

cout.write cessera d'imprimer exactement après length nombre de caractères.

+1

Cela a fonctionné! Merci beaucoup! Toujours les plus petites choses: / – Kraffs

7

Vous n'avez pas mis un terminateur null sur votre tableau char. Il ne lit pas trop ifstream, cout ne sait pas quand arrêter l'impression sans le terminateur null.

Si vous voulez lire un fichier entier, ce qui est beaucoup plus facile:

std::ostringstream oss; 
ifstream fin("index.html"); 
oss << fin.rdbuf(); 
std::string html = oss.str(); 
std::cout << html; 
+0

+1. IIRC le truc de recherche n'est même pas tout ce qui est fiable pour vous dire la taille du fichier, surtout si vous ouvrez le fichier en mode texte. –