Я действительно подозреваю, что здесь есть некоторая путаница в отношении термина "персонаж". Судя по вопросу OP, он использует термин «символ» для обозначения char
(в отличие от логического «символа», такого как многобайтовый символ UTF-8), и, таким образом, для чтения из в текстовом файле термин «символ» взаимозаменяем с «байтом».
Если это так, вы можете прочитать определенное количество байтов с диска, используя ifstream::read(),
например,
ifstream fileStream;
fileStream.open("file.txt", ios::in);
char buffer[1024];
fileStream.read(buffer, sizeof(buffer));
Чтение в буфер char
не повлияет на кодировку символов вообще. Точная последовательность байтов, хранящихся на диске, будет скопирована в буфер.
Однако это другая история, если вы используете многобайтовый набор символов, где каждый символ имеет переменную длину. Если символы не имеют фиксированного размера, невозможно прочитать в точности N символов с диска при считывании с одного диска. Это не ограничение C ++, это просто реальность работы с блочными устройствами (дисками). На самых низких уровнях вашей ОС блочные устройства адресуются в терминах блоков, которые в свою очередь состоят из байтов. Таким образом, вы всегда можете прочитать точное число байтов с диска , но вы не можете прочитать точное количество логических символов с диска, если каждый символ не является фиксированным числом байтов. Для наборов символов, таких как UTF-8, где каждый символ имеет переменную длину, вам придется либо читать весь файл, либо выполнять умозрительные чтения и анализировать буфер чтения после каждого чтения, чтобы определить, нужно ли читать больше.