Как вывести всю структуру в текстовый файл, используя winapi - PullRequest
0 голосов
/ 03 апреля 2012

Возможно ли вывести всю структуру в файл с помощью CreateFile / Writefile (WINAPI)

Я не хочу использовать объекты fstream. Поэтому, пожалуйста, не предлагайте ответы с ними.Заранее спасибо

Struct abc
{
    int a;
    int b;
    char c;
}

Я хочу сделать это с помощью API WriteFile / CreateFile. В настоящее время я делаю так

struct abc
{
    int a;
    int b;
    int c;
};

void main()
{   
    struct abc ob;
    ob.a=1;
    ob.b=2;
    ob.c=3;
    DWORD dwNumBytesWritten = 0;
    HANDLE hFile;
    hFile = CreateFile(FILENAME,
        FILE_APPEND_DATA, 
        FILE_SHARE_WRITE,
        NULL,
        OPEN_ALWAYS,
        FILE_ATTRIBUTE_NORMAL,
        NULL);

    WriteFile(hFile,
              (LPCVOID)&ob,
              sizeof(abc),
              (LPDWORD)&dwNumBytesWritten,
              NULL);
}

Но на выходе появляются некоторые неизвестные символы.

1 Ответ

4 голосов
/ 03 апреля 2012

Вы не можете просто сбросить произвольный объект, если хотите, чтобы он был удобочитаемым для человека.

Я бы предложил реализовать метод, который форматирует содержимое объекта в виде строки.Затем вы можете зарегистрировать его, используя любое количество механизмов.

class CLoggable
{
    public:
        virtual std::string GetContents() = 0;
};

struct abc : public CLoggable
{
    int a;
    std::string c;
    CSomeObject* pObj;

    virtual std::string GetContents()
    {
        std::string strBuffer;
        strBuffer += "a = ";
        strBuffer += std::to_string( static_cast< long long >( a ) );
        strBuffer += "c = ";
        strBuffer += c;
        strBuffer += "pObj = ";
        strBuffer += pObj == nullptr ? "Null object" : pObj->GetContents();
        // etc etc etc

        return strBuffer;
    }
};

// e.g.
abc obj;
logger.log( obj.GetContents() );

В качестве альтернативы можно реализовать оператор вставки потока и передать его непосредственно в стандартный вывод или файловый поток.

basic_ostream& operator<< ( abc& val );   // etc

abc obj;
std::cout << "Object contains : " << obj;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...