The cplusplus.com example for reading text files shows that a line can be read using the getline function. However, I don’t want to get an entire line; I want to get only a certain number of characters. How can this be done in a way that preserves character encoding?
I need a function that does something like this:
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
I thought about reading to a char buffer, but wouldn’t this change the character encoding?
I really suspect that there’s some confusion here regarding the term “character.” Judging from the OP’s question, he is using the term “character” to refer to a
char(as opposed to a logical “character”, like a multi-byte UTF-8 character), and thus for the purpose of reading from a text-file the term “character” is interchangeable with “byte.”If that is the case, you can read a certain number of bytes from disk using
ifstream::read(),e.g.Reading into a
charbuffer won’t affect the character encoding at all. The exact sequence of bytes stored on disk will be copied into the buffer.However, it is a different story if you are using a multi-byte character set where each character is variable-length. If characters are not fixed-size, there’s no way to read exactly N characters from disk with a single disk read. This is not a limitation of C++, this is simply the reality of dealing with block devices (disks). At the lowest levels of your OS, block devices are addressed in terms of blocks, which in turn are made up of bytes. So you can always read an exact number of bytes from disk, but you can’t read an exact number of logical characters from disk, unless each character is a fixed number of bytes. For character-sets like UTF-8 where each character is variable length, you’ll have to either read in the entire file, or else perform speculative reads and parse the read buffer after each read to determine if you need to read more.