FAQ:WinAPI VCPP:записать данные в файл

Материал из Весельчак У

Перейти к: навигация, поиск

Как записать данные в файл?

Способов несколько.

1. Если используется MFC проект с Doc/View-архитекурой, то самое простое, это воспользоваться сериализацией. Например, имеется переменная int m_nX. Запишем и прочитаем так:

void CMyDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
ar << m_nX; // пишем в файл
}
else
{
ar >> m_nX; //читаем из файла
}
}

Этот метод вызывается автоматически при открытии/записи файла при помощи кнопок и команд меню сохранить/открыть, созданных Визардом.

2. Можно использовать функции стандартной библиотеки С++.

// открытие
FILE *fopen(const char *filename, const char *mode);
 
// запись
size_t fwrite(const void *buffer, size_t size,size_t count, FILE *stream);
 
// чтение
size_t fread(void *buffer, size_t size, size_t count, FILE *stream);

К примеру, объявляем структуру данных, а затем массив этих структур. Далее открываем файл и сохраняем в него массив.

struct MyStruct
{
int i;
bool b;
char str[5];
};
 
// одна переменная
MyStruct st;
 
// массив структур
MyStruct mstr[100];
 
// открываем для записи (w) двоичный (b) файл myData.bin
FILE* f = fopen("myData.bin", "wb");
 
// запись массива
fwrite(mstr, sizeof(MyStruct), 100, f);
 
// запись одного экземпляра структуры
fwrite(&st, sizeof(MyStruct), 1, f);

3. Можно использовать функции API.

HANDLE CreateFile(
LPCTSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile
);
 
BOOL WriteFile(
HANDLE hFile,
LPCVOID lpBuffer,
DWORD nNumberOfBytesToWrite,
LPDWORD lpNumberOfBytesWritten,
LPOVERLAPPED lpOverlapped
);
 
BOOL CloseHandle(HANDLE hObject);

4. Можно воспользоваться методами классов CFile и CStdioFile (MFC).