用于读取文本文件的cplusplus.com示例显示可以使用该getline函数读取行.但是,我不想得到一整行; 我想只获得一定数量的角色.如何以保留字符编码的方式完成此操作?
我需要一个像这样的函数:
ifstream fileStream;
fileStream.open("file.txt", ios::in);
resultStream << getstring(fileStream, 10); // read first 10 chars
file.ftell(10); // move to the next item
resultStream << getstring(fileStream, 10); // read 10 more chars
Run Code Online (Sandbox Code Playgroud)
我想过读取一个char缓冲区,但这不会改变字符编码吗?
我真的怀疑这里有一些关于术语"性格"的混淆.从OP的问题来看,他使用术语"字符"来表示char(而不是逻辑"字符",如多字节UTF-8字符),因此,为了从文本中读取 -文件术语"字符"可与"字节"互换.
如果是这种情况,您可以使用ifstream::read(),例如从磁盘读取一定数量的字节
ifstream fileStream;
fileStream.open("file.txt", ios::in);
char buffer[1024];
fileStream.read(buffer, sizeof(buffer));
Run Code Online (Sandbox Code Playgroud)
读入char缓冲区根本不会影响字符编码.存储在磁盘上的确切字节序列将被复制到缓冲区中.
但是,如果您使用的是多字节字符集,则每个字符都是可变长度的,这是另一回事.如果字符不固定大小的,有没有办法读取正好从磁盘中的单个磁盘读取N个字符.这不是C++的限制,这只是处理块设备(磁盘)的现实.在操作系统的最低级别,块设备按块进行寻址,而块又由字节组成. 因此,您始终可以从磁盘读取确切的字节数,但无法从磁盘读取确切数量的逻辑字符,除非每个字符都是固定的字节数.对于像UTF-8这样每个字符都是可变长度的字符集,你必须读入整个文件,否则执行推测性读取并在每次读取后解析读取缓冲区以确定是否需要读取更多.