C ++ Ifstream читает слишком много? - PullRequest
2 голосов
/ 13 августа 2011

Я пытаюсь прочитать файл и вывести содержимое. Все работает отлично, я вижу содержимое, но, кажется, добавить около 14 пустых байтов в конце. Кто-нибудь знает, что не так с этим кодом?

                    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;

Ответы [ 2 ]

7 голосов
/ 13 августа 2011

Вы не поместили нулевой терминатор в свой массив символов. Дело не в том, что если поток слишком много читает, cout просто не знает, когда прекратить печать без нулевого терминатора.

Если вы хотите прочитать весь файл, это намного проще:

std::ostringstream oss;
ifstream fin("index.html");
oss << fin.rdbuf();
std::string html = oss.str();
std::cout << html;
5 голосов
/ 13 августа 2011

Это связано с тем, что 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 числа символов.

...