Fstream tellg/seekg возвращает более высокое значение, чем ожидалось - программирование
Подтвердить что ты не робот

Fstream tellg/seekg возвращает более высокое значение, чем ожидалось

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

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

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

char *continut = new char[lungime];

Любая идея, что может быть проблемой?

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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