Работа с файлом
Подскажите пожалуйста как изменить запись внутри файла (т.е. ввести новые данные и заменить старые находящиеся в определенном месте)
Как сделать выборку из файла, например -
Распечатка в алфавитном порядке абонентов из заданного диапазона номеров или фамилий; например, для номеров диапазон может быть: 222222 - 333333, а для фамилий: Иванаускас - Иванов (то есть Иванова в диапазон не входит).
(файл двоичный)
Привет.
Подскажите пожалуйста как изменить запись внутри файла (т.е. ввести новые данные и заменить старые находящиеся в определенном месте)
Как сделать выборку из файла, например -
Распечатка в алфавитном порядке абонентов из заданного диапазона номеров или фамилий; например, для номеров диапазон может быть: 222222 - 333333, а для фамилий: Иванаускас - Иванов (то есть Иванова в диапазон не входит).
(файл двоичный)
Знаю два способа изменения информации в файле:
- Полная перезапись файла
- Отображение файла в память
Второй вопрос немного непонятен.
Насколько я понял, если файл обычный и тебе нужна информация по двум ключам, надо читать весь файл и обрабатывать данные в памяти.
Есть другой вариант. Можно создать файл с двойной индексацией: вначале идет информация по одному индексу, потом по другому, а затем данные. Индексы представляют собой примерно следующую структуру:
{
char[20] key; // собсно ключ
char[20] offset; // смещение в файле
};
Только файл получается текстовый :P , хотя не факт
Но это только идея
если знаешь позицию, с которой она находится, то очень просто: fseek на эту позицию и fprintf (а можно SetFilePointer с WriteFile)
если не знаешь, где запись, то читаешь в цикле каждую запись, и если данные очередной прочитанной записи совпадают с искомыми, fseek (или SetFilePointer) на позицию, равную текущей минус размер записи, а потом записываешь, как и в первом случае.
заменить запись можно так:
Я сделал таким способом. Наверное он правильный, но оптимальный ли???
//----------------------------------------------
void person::modifyData(int mod)
{
ifstream infile;
ofstream outfile;
infile.open(datafile, ios::binary);
outfile.open("temp.dat", ios::app | ios::binary);
int n = diskCount(datafile); //число человек в файле
if (mod > n)
{
cout << "\nThere are not "<< mod <<" Person\n";
}
else
{
for (int i = 0; i < mod; i++)
{
infile.seekg(i*sizeof(person));
infile.read((char*)this, sizeof(*this));
outfile.write((char*)this,sizeof(*this));
}
getData();
outfile.write((char*)this,sizeof(*this)); //записать в него
for (i = mod+1; i < n; i++)
{
infile.seekg(i*sizeof(person));
infile.read((char*)this, sizeof(*this));
outfile.write((char*)this,sizeof(*this));
}
}
infile.close();
outfile.close();
removeFile(); //удаление файла
renameFile(); // переименование файла
}