2011-08-13 80 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不是空值终止字符串,std::cout保持打印字符,直到它找到\0,或者它可能会崩溃你的程序

这样做:

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

你没有在你的char数组上放置一个空终止符。这不是ifstream太多的读取,cout只是不知道何时停止打印而没有null终止符。

如果你想阅读整个文件,这是很容易:

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

+1。 IIRC寻求技巧甚至不足以告诉你文件的大小,特别是当你用文本模式打开文件时。 –