Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Работа с файлом

435
19 декабря 2003 года
avatara
188 / / 07.07.2003
Привет.
Подскажите пожалуйста как изменить запись внутри файла (т.е. ввести новые данные и заменить старые находящиеся в определенном месте)

Как сделать выборку из файла, например -
Распечатка в алфавитном порядке абонентов из заданного диапазона номеров или фамилий; например, для номеров диапазон может быть: 222222 - 333333, а для фамилий: Иванаускас - Иванов (то есть Иванова в диапазон не входит).

(файл двоичный)
1.3K
19 декабря 2003 года
view
148 / / 14.10.2003
Цитата:
Originally posted by avatara
Привет.
Подскажите пожалуйста как изменить запись внутри файла (т.е. ввести новые данные и заменить старые находящиеся в определенном месте)

Как сделать выборку из файла, например -
Распечатка в алфавитном порядке абонентов из заданного диапазона номеров или фамилий; например, для номеров диапазон может быть: 222222 - 333333, а для фамилий: Иванаускас - Иванов (то есть Иванова в диапазон не входит).

(файл двоичный)



Знаю два способа изменения информации в файле:

  • Полная перезапись файла
  • Отображение файла в память
Причем, вторым способом пользоваться не приходилось. А в первом - читаешь из старого файла во временный до места, с которого надо заменить или добавить данные, добавляешь новые данные и дописываешь остаток из старого файла. Затем меняешь старый файл на новый.

Второй вопрос немного непонятен.
Насколько я понял, если файл обычный и тебе нужна информация по двум ключам, надо читать весь файл и обрабатывать данные в памяти.
Есть другой вариант. Можно создать файл с двойной индексацией: вначале идет информация по одному индексу, потом по другому, а затем данные. Индексы представляют собой примерно следующую структуру:
 
Код:
struct index
{
  char[20] key; // собсно ключ
  char[20] offset; // смещение в файле
};

Только файл получается текстовый :P , хотя не факт
Но это только идея
1.8K
19 декабря 2003 года
neutrino4
94 / / 05.09.2003
заменить запись можно так:
если знаешь позицию, с которой она находится, то очень просто: fseek на эту позицию и fprintf (а можно SetFilePointer с WriteFile)
если не знаешь, где запись, то читаешь в цикле каждую запись, и если данные очередной прочитанной записи совпадают с искомыми, fseek (или SetFilePointer) на позицию, равную текущей минус размер записи, а потом записываешь, как и в первом случае.
435
20 декабря 2003 года
avatara
188 / / 07.07.2003
Цитата:
Originally posted by neutrino4
заменить запись можно так:


Я сделал таким способом. Наверное он правильный, но оптимальный ли???

//----------------------------------------------
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(); // переименование файла
}

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог