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

Материал из Весельчак У
Перейти к: навигация, поиск
м (Как записать данные в файл?)
 
Строка 5: Строка 5:
 
1. Если используется MFC проект с  Doc/View-архитекурой, то самое простое, это воспользоваться сериализацией. Например, имеется переменная int m_nX. Запишем и прочитаем так:
 
1. Если используется MFC проект с  Doc/View-архитекурой, то самое простое, это воспользоваться сериализацией. Например, имеется переменная int m_nX. Запишем и прочитаем так:
  
<pre>
+
<syntaxhighlight lang="cpp">
 
void CMyDoc::Serialize(CArchive& ar)
 
void CMyDoc::Serialize(CArchive& ar)
 
{
 
{
Строка 17: Строка 17:
 
}
 
}
 
}
 
}
</pre>
+
</syntaxhighlight>
  
 
Этот метод вызывается автоматически при открытии/записи файла при помощи
 
Этот метод вызывается автоматически при открытии/записи файла при помощи
Строка 24: Строка 24:
 
2. Можно использовать функции стандартной библиотеки С++.
 
2. Можно использовать функции стандартной библиотеки С++.
  
<pre>
+
<syntaxhighlight lang="cpp">
 
// открытие
 
// открытие
 
FILE *fopen(const char *filename, const char *mode);
 
FILE *fopen(const char *filename, const char *mode);
Строка 33: Строка 33:
 
// чтение
 
// чтение
 
size_t fread(void *buffer, size_t size, size_t count, FILE *stream);
 
size_t fread(void *buffer, size_t size, size_t count, FILE *stream);
</pre>
+
</syntaxhighlight>
  
 
К примеру, объявляем структуру данных, а затем массив этих структур. Далее открываем файл и сохраняем в него массив.
 
К примеру, объявляем структуру данных, а затем массив этих структур. Далее открываем файл и сохраняем в него массив.
  
<pre>
+
<syntaxhighlight lang="cpp">
 
struct MyStruct
 
struct MyStruct
 
{
 
{
Строка 59: Строка 59:
 
// запись одного экземпляра структуры
 
// запись одного экземпляра структуры
 
fwrite(&st, sizeof(MyStruct), 1, f);
 
fwrite(&st, sizeof(MyStruct), 1, f);
</pre>
+
</syntaxhighlight>
  
 
3. Можно использовать функции API.
 
3. Можно использовать функции API.
  
<pre>
+
<syntaxhighlight lang="cpp">
 
HANDLE CreateFile(
 
HANDLE CreateFile(
 
LPCTSTR lpFileName,
 
LPCTSTR lpFileName,
Строка 83: Строка 83:
  
 
BOOL CloseHandle(HANDLE hObject);
 
BOOL CloseHandle(HANDLE hObject);
</pre>
+
</syntaxhighlight>
  
 
4. Можно воспользоваться методами классов CFile и CStdioFile (MFC).
 
4. Можно воспользоваться методами классов CFile и CStdioFile (MFC).
  
 
[[Category:FAQ:WinAPI VCPP]]
 
[[Category:FAQ:WinAPI VCPP]]

Текущая версия на 01:07, 30 июля 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).