C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Работа с файлами, Чтение/запись в файл любых данных
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 );

}

Вернуться в Вопросы программирования в C++Builder