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).