Schumi |
Отправлено: 07.09.2003, 16:24 |
|
Машинист паровоза
Группа: Участник
Сообщений: 206
|
Чего-то торможу. Ни как не пойму, можно в Билдере читать/записывать в файл данные,типа целые числа,строки. Я знаю в Паскале можно объявлять файлы текстовые,типизированные. А можно так же делать в С++. Допустим,мне надо открыть файл,прочитать 10 целых чисел,а строку, длиной 17 символов. Я знаю,можно читать в буфер данные. Но как-то не очень хочется разбирать каждый символ.
Хотелось бы так:
int j;
Read(HandleF,j).
Или это только мечты?
|
|
Garrett |
Отправлено: 07.09.2003, 16:29 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 39
|
Сделай нужную тебе структуру, затем CreateFile/ReadFile/WriteFile. |
|
Георгий |
Отправлено: 07.09.2003, 18:48 |
|
Почетный железнодорожник
Группа: Модератор
Сообщений: 874
|
тут наверное примерчик не помешал бы:
пример работы с "типизированными" файлами — структура файла задаётся структурой FileStruct, алгоритм:
1. записывается нечто в поля структуры
1. открывается файл
2. записывается в файл содержимое структуры одного экземпляра структуры
3. устанавливается файловый указатель на начало файла
4. считывается из файла содержимое структуры в другой экземпляр структуры
5. файл закрывается
Примечания:
1. корректность работы можно проверить в отладчике
2. для работы с файлами используются функции Win32API, но аналогичным образом можно использовать любые другие функции и объекты для работы с файлами
CODE | void ShowLastError(void)
{
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL
);
// Display the string.
MessageBox( NULL,(char*) lpMsgBuf, "GetLastError", MB_OK|MB_ICONINFORMATION );
// Free the buffer.
LocalFree( lpMsgBuf );
};
struct FileStruct
{
int Numbers[10];
char String[17];
};
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HANDLE hFile;
FileStruct fs,fs2;
DWORD bytes;
int i;
for (i=0; i< (sizeof (fs.Numbers)/sizeof(fs.Numbers[0])); i++)
fs.Numbers[i]=i;
strncpy(fs.String,"test string",sizeof(fs.String));
hFile=CreateFile("c:\\test.bin", GENERIC_READ|GENERIC_WRITE, 0, 0, OPEN_ALWAYS, 0, 0 );
try {
if ( hFile==INVALID_HANDLE_VALUE )
{
ShowLastError();
throw Exception("не удалось открыть файл");
}
if (!WriteFile(hFile, &fs, sizeof(fs), &bytes, 0) || bytes!=sizeof(fs) )
{
ShowLastError();
throw Exception("не удалось записать в файл");
}
if ( SetFilePointer( hFile, 0, 0, FILE_BEGIN ) == 0xFFFFFFFF )
{
ShowLastError();
throw Exception("не удалось переместить файловый указатель");
};
if (!ReadFile(hFile, &fs2, sizeof(fs2), &bytes, 0) || bytes!=sizeof(fs2) )
{
ShowLastError();
throw Exception("не удалось прочитать из файла");
};
}
catch (Exception & e)
{
ShowMessage(e.Message);
}
CloseHandle( hFile );
} | |
|
|