C ++ и бинарные файлы - вопрос новичка - PullRequest
0 голосов
/ 15 мая 2011

У меня есть следующий код, и я пытаюсь записать некоторые данные в двоичном файле. Проблема в том, что у меня нет опыта работы с бинарными файлами, и я не могу понять, что я делаю.

#include <iostream>
#include <fstream>
#include <string>

#define RPF 5

using namespace std;

int write_header(int h_len, ofstream& f)
{
    int h;
    for(h=0;h<h_len;h++)
    {
        int num = 0;
        f.write((char*)&num,sizeof(char));
    }
    return 0;
}
int new_file(const char* name)
{
    ofstream n_file(name,ofstream::binary);
    write_header(RPF,n_file);
    n_file.close();
    return 0;
}

int main(int argc, char **argv)
{
    ofstream file("file.dat",ofstream::binary);
    file.seekp(10);
    file.write("this is a message",3);
    new_file("file1.dat");
    cin.get();
    return 0;
}

1. Как вы видите, я открываю file.dat и пишу внутри слова "thi". Затем я открываю файл и вижу его значение ASCII. Почему это происходит?

  1. Затем я создаю новый файл file1.dat и пытаюсь записать в него число 0 пять раз. Что я должен использовать?

это

f.write((char*)&num,sizeof(char));

или это

f.write((char*)&num,sizeof(int));

и почему я не могу записать значение числа как есть, и мне нужно привести его как char*? Это потому что write() работает так или я могу записать только двоичные символы в двоичный файл?

Может кто-нибудь помочь мне понять, что происходит?

Ответы [ 2 ]

2 голосов
/ 15 мая 2011

Функция write (), которая указывает на ваш буфер данных и длину в байтах данных, которые будут переданы в файл.Поэтому, когда вы говорите

file.write("this is a message",3);

, вы указываете функции записи записать 3 байта в файл.И это "thi".

Этот

f.write((char*)&num,sizeof(char));

сообщает функции записи, чтобы поместить размер байта (char) в файл.Это 1 байт.Вы, вероятно, хотите это

f.write((char*)&num,sizeof(int));

, так как num - это переменная типа int.

0 голосов
/ 15 мая 2011
  1. Вы записываете строку ASCII "thi" в файл file.dat. Если вы откроете файл в шестнадцатеричном редакторе, вы увидите «74 68 69», которое представляет собой числовое представление этих символов. Но если вы откроете файл file.dat в редакторе, который понимает ASCII, он, скорее всего, переведет эти значения обратно в их представление ASCII, чтобы его было легче просматривать. Открытие режима ofstream в режиме ios::binary означает, что данные выводятся в файл как есть, и поток не может быть применен потоком перед обработкой.

  2. Функция ofstream::write(const char *data, streamsize len) имеет два параметра. data похож на это так, что write работает с отдельными байтами. Вот почему вы должны сначала привести num к персонажу *. Второй параметр, len , указывает, сколько байтов, начиная с data , будет записано в файл. Я бы посоветовал использовать write(static_cast<char*>(num), sizeof(num)), а затем установить num на тип, достаточно большой для хранения необходимых данных. Если вы объявите int num, то на 32-битной платформе в файл будет записано 20 нулевых байтов. Если вам нужно только 5 нулевых байтов, объявите как char num.

...