C ++ запись в двоичный файл с ofstream - PullRequest
2 голосов
/ 29 октября 2011

Для небольшого формата файла, который я разрабатываю, мне нужно вывести заголовок 519 байт в файл. Я немного новичок во всей концепции ofstream. Хотя у меня есть некоторый опыт чтения заголовка файла Truevision Targa. Но вывод - это то, с чем я хорошо знаком.

Итак, вот моя проблема.

Я открыл экземпляр ofstream, и мне нужно вывести заголовок примерно так:

typedef struct header {
    char      version;   // offset 0, length 1
    short int width;     // offset 1, length 2
    short int height;    // offset 3, length 2
    short int pathlen;   // offset 5, length 2
    char      desc[512]; // offset 7, length 512
} fileHeader;

Теперь мне нужно получить все это в первых 519 байтах файла, остальное содержимое варьируется, как бы я копировал этот заголовок в мой файл?

Я бы хотел сделать это, используя класс ofstream, но я также в порядке с исходной библиотекой Си. Я занимаюсь этим уже 2 часа, но пока никуда не попал, и попытка поиска в Google тоже мало поможет.

1 Ответ

3 голосов
/ 29 октября 2011
std::ofstream& operator<<(std::ofstream& out, const header& myheader) {
    out.write((char*)&myheader.version, sizeof(myheader.version));
    out.write((char*)&myheader.width, sizeof(myheader.width));
    out.write((char*)&myheader.height, sizeof(myheader.height));
    out.write((char*)&myheader.pathlen, sizeof(myheader.pathlen));
    out.write((char*)&myheader.desc, sizeof(myheader.desc));
    return out;
}
std::ifstream& operator>>(std::ifstream& in, header& myheader) {
    in.read((char*)&myheader.version, sizeof(myheader.version));
    in.read((char*)&myheader.width, sizeof(myheader.width));
    in.read((char*)&myheader.height, sizeof(myheader.height));
    in.read((char*)&myheader.pathlen, sizeof(myheader.pathlen));
    in.read((char*)&myheader.desc, sizeof(myheader.desc));
    return in;
}

int main() {
    std::cout << fileHeader << '\n';
    std::cin >> fileHeader;
    return 0;
}

Поскольку у вас нет указателей, это довольно просто!(Обратите внимание, что это работает только с узкими потоками)
Другой пример, чтобы показать вещи с текстом и динамической памятью / указатели / etc

class thing {
    std::string name;
    int height;
    friend std::ofstream& operator<<(std::ofstream& out, const thing & myheader);
    friend std::ifstream& operator>>(std::ifstream& in, thing & myheader);
public: 
    thing() {}
};

std::ofstream& operator<<(std::ofstream& out, const thing & myheader) {
    thing << name.size() << ' ';
    thing.write(&name[0], name.size()) << ' ' << height;
} 
std::ifstream& operator>>(std::ifstream& in, thing & myheader) {
    int size;
    in >> size;
    myheader.name.resize(size);
    in.read(&myheader.name[0], name.size());
    return in >> myheader.height;        
} 
...