Доступ к блоку памяти (массив / C / C ++), как к потоку файлов

Есть ли способ сделать это в C (или C ++)?

Справочная информация: я буду построчно читать блок памяти или большой файл и обрабатывать эти строки по одному, и мне лень писать одно и то же дважды, один раз для блоков памяти и один раз для потоков файлов , Если необходимо использовать версию файлового потока, файл не помещается в память. Понятно, что я мог сохранить блок памяти в файл, а затем получить доступ к тем же данным с помощью файлового потока, но это кажется пустой тратой компьютерного времени.

Я знаю о / dev / shm в системах Linux. Есть ли что-то более переносимое, что дает мне такую ​​же абстракцию на уровне языка (C или C ++)?

4

Решение

В C вы можете использовать sprintf а также sscanf, в C++ Здесь станд :: stringstream класс, который построен с использованием строки. Таким образом, вы можете сделать функцию взять std::istream в качестве аргумента и передать либо std::ifstream из std::istringstream в зависимости от случая.

8

Другие решения

Вы могли бы использовать функцию open_memstream(3) и связанные с ней функции, если они доступны в вашей системе. (glibc и POSIX 2008): open_memstream (3) справочная страница,

3

Вы можете написать свой собственный буфер потока, например, так:

#include <streambuf>
#include <istream>
#include <iomanip>
#include <iostream>

template<
class CharT,
class Traits = std::char_traits<CharT>
> class basic_MemoryBuffer : public std::basic_streambuf<CharT, Traits> {
public:
basic_MemoryBuffer(CharT* ptr, std::size_t size)  {
setg(ptr, ptr, ptr+size);
}
};

typedef basic_MemoryBuffer<char> MemoryBuffer;

int main () {
char data[] = "Hello, world\n42\n";

MemoryBuffer m(data, sizeof(data)-1);
std::istream in(&m);

std::string line;
while(std::getline(in, line)) {
std::cout << line << "\n";
}
}
2