Tellg / seekg Fstream возвращает более высокое значение, чем ожидалось - PullRequest
4 голосов
/ 15 апреля 2010

Почему это не получается, оно должно быть простым и работать?

fisier.seekg(0, ios::end);
long lungime = fisier.tellg();

Возвращает большее значение, чем значение файла, что приводит к неверному

char *continut = new char[lungime];

Есть идеи, в чем может быть проблема?

Я также попытался сосчитать до конца файла по одному символу за раз, что дало тот же результат, большее число, чем ожидалось. Но при использовании getline () для чтения по одной строке за раз, это работает, лишних пробелов нет ...

Ответы [ 2 ]

10 голосов
/ 15 апреля 2010

По-видимому, вы открываете файл в переведенном режиме, возможно, под Windows. Когда вы просто ищете конец файла, текущая позиция не учитывает переводы конца строки. Конец строки (во внешнем файле) отмечен парой "\ r \ n" - но когда вы читаете его, он преобразуется в просто "\ n". Когда вы используете getline для чтения по одной строке за раз, все \n также удаляются, поэтому даже в системе (например, Unix / Linux), которая не переводит внешнее представление во внутреннее, вы все равно можете ожидать те, чтобы дать разные размеры.

Опять же, вы должны действительно забыть, что new [] существует вообще. Если вы хотите прочитать весь файл в строку, попробуйте что-то вроде этого:

std::stringstream continut;
continut << fisier.rdbuf();

continut.str() - это std::string, содержащий данные из файла.

1 голос
/ 28 марта 2013

Джерри Коффин прав насчет концов строки.

Однако вам не нужно использовать stringstream, чтобы правильно прочитать весь файл. Вам просто нужно открыть его как двоичный файл, используя std :: ios :: binary в конструкторе std :: ifstream.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...