Дан текстовый файл, программа должна вывести файл в консоль, но выводит какие-то каракули

int i={0},n={0};
 setlocale(LC_ALL, "Russian");
 std::ifstream input_file("texst.txt");
 while(!input_file.eof())
 {
   n++;
   input_file.get();
 }
 char* line = new char[n];
 while(!input_file.eof())
 {
   line[i++] = input_file.get();
   //if (line[i]==probel)
 }
line[i] = '\0';
 for (int i = 0; i < n; ++i)
 {
   std::cout << line[i];
 }
std::cout <<std::endl;
return 0;
}

Ответы (1 шт):

Автор решения: AlexGlebe

Вы считали всё до конца, а в начало файла не перешли. Второй цикл не выполнился и получили мусор памяти.

Чтобы исправить это нужно очистить состояние конца файла и перейти в начало :

input_file.clear();
input_file.seekg (0, input_file.beg);

И по-проще узнать размер файла можно так :

input_file.seekg (0, input_file.end);
n = input_file.tellg();
input_file.clear();
input_file.seekg (0, input_file.beg);

SEEKG


Вторая ошибка это использование флага конца файла. Сначала делается попытка чтения, затем проверка успеха и только потом прибавление количества.

do {
  input_file.get();
  if ( input_file.eof())
    break;
  n++;
 } while ( true );
..
do {
   char c = input_file.get();
   if ( input_file.eof())
     break;
   line[i++] = c;
 } while ( true ) ;

Уберите line[i] = '\0'; - это приводит к порче памяти, вы выходите за пределы массива.

→ Ссылка