Дан текстовый файл, программа должна вывести файл в консоль, но выводит какие-то каракули
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);
Вторая ошибка это использование флага конца файла. Сначала делается попытка чтения, затем проверка успеха и только потом прибавление количества.
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'; - это приводит к порче памяти, вы выходите за пределы массива.