FAQ:WinAPI VCPP:записать данные в файл — различия между версиями

Материал из Весельчак У
Перейти к: навигация, поиск
(Новая: ===Как записать данные в файл?=== Способов несколько. # Если используется MFC проект с Doc/View-архитекурой, ...)
 
Строка 3: Строка 3:
 
Способов несколько.
 
Способов несколько.
  
# Если используется MFC проект с  Doc/View-архитекурой, то самое простое, это воспользоваться сериализацией. Например, имеется переменная int m_nX. Запишем и прочитаем так:
+
1. Если используется MFC проект с  Doc/View-архитекурой, то самое простое, это воспользоваться сериализацией. Например, имеется переменная int m_nX. Запишем и прочитаем так:
  
 
<pre>
 
<pre>
Строка 22: Строка 22:
 
кнопок и команд меню сохранить/открыть, созданных Визардом.
 
кнопок и команд меню сохранить/открыть, созданных Визардом.
  
# Можно использовать функции стандартной библиотеки С++.
+
2. Можно использовать функции стандартной библиотеки С++.
  
 
<pre>
 
<pre>
Строка 61: Строка 61:
 
</pre>
 
</pre>
  
# Можно использовать функции API.
+
3. Можно использовать функции API.
  
 
<pre>
 
<pre>
Строка 85: Строка 85:
 
</pre>
 
</pre>
  
# Можно воспользоваться методами классов CFile и CStdioFile (MFC).
+
4. Можно воспользоваться методами классов CFile и CStdioFile (MFC).
  
 
[[Category:FAQ:WinAPI VCPP]]
 
[[Category:FAQ:WinAPI VCPP]]

Версия 10:24, 29 июля 2008

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

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

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