2011-08-13 6 views
2

ファイルを読み込んで内容を出力しようとしています。すべて正常に動作しますが、内容は確認できますが、最後に約14個の空のバイトが追加されているようです。誰もこのコードで何が間違っているか知っていますか?C++ Ifstreamはあまりにも多くの読み取りですか?

    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; 

答えて

5

htmlがNULLで終了する文字列ではなく、それは\0を見つけるまでstd::coutを印刷文字を続けるか、それがクラッシュすることがあるためであります

html = new char [length +1 ]; 

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

それとも、あなたがこれを行うことができます:

をあなたのプログラム

は、これを行います

cout.write(html, length); 

cout.writeは、length文字数の直後に印刷を停止します。

+1

それは働いた!どうもありがとう!常に最も軽いもの:/ – Kraffs

7

文字配列にヌルターミネータを挿入していません。 ifstreamの読み込みがあまりにも多くないので、ヌルターミネータなしで印刷をいつ停止するのか分かりません。

あなたはファイル全体を読み込みたい場合は、これははるかに簡単です:

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

+1。 IIRCでは、特にテキストモードでファイルを開いている場合、シークトリックはファイルサイズを伝える信頼できるものではありません。 –

関連する問題