С++; запись/чтение в бинарный файл
167 сообщений
#15 лет назад
Здравствуйте, возникла тут небольшая проблемка, надеюсь что кто поможет)Как изменить N-ную запись в файле?
13 сообщений
#15 лет назад
Я могу ошибаться но fseek будет корректно работать только для бинарынх файлов для текстовых он не гарантирует точное позиционирование. Но повтарюсь могу и ошибаться, на всякий случай чтобы не было ошибок потом.
731 сообщение
#15 лет назад
C текстовыми файлами тоже он может работать. Просто программист не может гарантировать точного произвольного позиционирования. Но т.к. тема про бинарный файл - это то что нужно.
167 сообщений
#15 лет назад
Спасибо ребята, но я тут подумав решил все таки извлекать на время все записи в динамический массив структур, затем редактировать его данные, и потом записывать обратно в бинарник=) догадываюсь что есть более эффективное решение (а именно работу в самом бинарном файле - догадываюсь что wiseman33 это и имел в виду=) )Если знаете что - пишите, буду рад!
601 сообщение
#15 лет назад
Не обязательно все читать в память.если кратко то как то так.
#include <iostream.h>
#include <fstream.h>
#define SIZE_OF_MY_RECORD 64
#define NUMBER_OF_MY_RECORD 10
int main()
{
MyRecordType val;
ifstream input;
ofstream output;
input.open ("filename", ios::in | ios::binary); // отрываем поток на чтение
input.seekg ((NUMBER_OF_MY_RECORD - 1)*SIZE_OF_MY_RECORD,ios::beg); //сдвигаем считывающую головку на (NUMBER_OF_MY_RECORD - 1)*SIZE_OF_MY_RECORD байт от начала файла
input.read (&val, sizeof(val)); //читаем данные в структуру.
input.close ();//закрываем поток на чтение.
/*
производим операции над структурой val
*/
output.open ("filename", ios::out | ios::binary); // отрываем поток на запись
output.seekp ((NUMBER_OF_MY_RECORD - 1)*SIZE_OF_MY_RECORD,ios::beg); //сдвигаем записывающую головку на (NUMBER_OF_MY_RECORD - 1)*SIZE_OF_MY_RECORD байт от начала файла
output.write (&val, sizeof(val)); //запичываем данные в файл.
output.close ();//закрываем поток на запись.
return 0;
}