Помимо обычных методов поиска и чтения, упомянутых выше, вы также можете отобразить файл в свое пространство процесса, используя что-то вроде mmap () и получить прямой доступ к данным.
Например, для следующего файла данных "foo.dat":
one two three
Следующий код напечатает весь текст после первых четырех байтов с использованием подхода mmap () :
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <iostream>
int main()
{
int result = -1;
int const fd = open("foo.dat", O_RDONLY);
struct stat s;
if (fd != -1 && fstat(fd, &s) == 0)
{
void * const addr = mmap(0, s.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
if (addr != MAP_FAILED)
{
char const * const text = static_cast<char *>(addr);
// Print all text after the first 4 bytes.
std::cout << text + 4 << std::endl;
munmap(addr, s.st_size);
result = 0;
}
close(fd);
}
return result;
}
Вы даже можете использовать этот подход для прямой записи в файл (не забывайте msync () при необходимости).
Библиотеки, такие как Boost и ACE, обеспечивают удобную инкапсуляцию C ++ для mmap () (и эквивалентной функции Windows).
Этот подход, вероятно, излишний для небольших файлов, но он может быть огромным выигрышем для больших файлов. Как обычно, профилируйте свой код, чтобы определить, какой подход лучше.