Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 24.09.2008
Сообщений: 26
1

Файл произвольного доступа

22.06.2009, 13:51. Показов 1472. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, снова к файлам, такая задача.
Допустим, у меня есть текстовый файл с данными - код, название, количество, и со значениями по умолчанию - 0, пустая строка, 0, соответственно. Как здесь:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
ofstream OutWare ("hardware.txt", ios::out);
    if (!OutWare) {
        cerr << "File OutWare cannot be opened\n";
        exit(1);
    }
 
    Hardware blankWare = { 0, " ", 0 };
 
    for (int i=1; i<=100; i++) {
    OutWare << blankWare.number << " " << blankWare.name << " " << blankWare.quantity << " "
    << blankWare.price << endl;
  return 0;
}
Необходимо иметь возможность произвольно апдейтить записи, т.е., например, мне нужно в четвертую строку занести реальные данные. Как при этом перемещаться между записями? Ведь нет определенного размера каждой строки. Пока она пустая, она содержит одно количество символов, заполненная - другое.
Метод write, хоть и пишет структуру полностью, т.е. размер известен, и становится возможным использование метода seekp, но, как уже упоминалось тут Записывается мусор в файл, пишет мусор в файл.
Например, если я пишу так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
ofstream OutWare ("hardware.txt", ios::ate);
    if (!OutWare) {
        cerr << "File OutWare cannot be opened\n";
        exit(1);
    }
 Hardware Ware;
 cout << "Введите код: ";
 while(cin>>Ware.number) {
    OutWare.seekp((Ware.number-1)*sizeof(Ware));
    cout << "Введите название и количество: ";
    cin >> Ware.name >> Ware.quantity;
    OutWare.write(reinterpret_cast<char*>(&Ware), sizeof(Ware));
    cout << "Enter the number: ";
    }
в файле мусор, а если убрать write и писать
C++
1
OutWare << Ware.number << " " << Ware.name << " " << Ware.quantity << endl;
- в файле полный беспорядок (что естественно, поскольку seekp здесь неправильно работает).
Как в этом случае поступить?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.06.2009, 13:51
Ответы с готовыми решениями:

Файл произвольного доступа
Читаю Дейтелов, про файлы произвольного доступа. Написал вроде как по примеру, но что-то идет не...

Файл произвольного доступа
Очень прошу помощи так как не могу с ними разобраться который день, видать делаю одну и ту же...

Не могу прочитать файл произвольного доступа с конца
Странное происходит в функции read_file, а именно не работает seekg. Почему-то читается всё время...

Детектировать итератор произвольного доступа
здравствуйте, нужно детектировать итератор произвольного доступа... это не работает: template&lt;...

5
591 / 357 / 16
Регистрация: 06.02.2009
Сообщений: 1,386
22.06.2009, 13:59 2
Открой файл в двоичном режиме.
0
0 / 0 / 0
Регистрация: 24.09.2008
Сообщений: 26
22.06.2009, 14:06  [ТС] 3
Цитата Сообщение от RazorQ Посмотреть сообщение
Открой файл в двоичном режиме.
ios::binary никаких видимых изменений к лучшему не производит.
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
22.06.2009, 14:07 4
Если я правильно понял постановку задачи, то по простому её можно решить, задав фиксированный размер всем записям. Т.е. у тебя есть структура типа

C
1
2
3
4
5
struct
{
  char name[256];
  char quantity [256];
}
И ты эту структуру всегда целиком сбрасываешь в файл

Недостатки этого метода очевидны - ограничение на длину строки и необоснованное распухание файла: мы всегда пишем по 256 байт на строку, независимо от того, сколько в строке полезных символов.

Более продвинутый вариант, это когда ты в начале работы считываешь ЦЕЛИКОМ свой файл. Обрабатываешь данные как надо, а затем ЦЕЛИКОМ файл записываешь. Недостатком этого метода является геморой при работе с большими файлами, особенно если содердимое файла целиком не влезает в память

Ну и самый правильный вариант - это работать таким же образом, как работают системы упарвления базами данных. Тут надо долго разбираться с тем, как они организуют работу с хранением данный в файле и т.п. Поскольку у тебя врядли стоИт задача обрабатывать десятки гигабайт данных, то такой вариант для тебя отпадает
0
0 / 0 / 0
Регистрация: 24.09.2008
Сообщений: 26
22.06.2009, 14:28  [ТС] 5
Цитата Сообщение от Evg Посмотреть сообщение
по простому её можно решить, задав фиксированный размер всем записям
С такой реализацией понятно, спасибо, а вот более продвинутый вариант, считывающий файл целиком - можно поподробнее? Каким образом это осуществляется?
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
22.06.2009, 14:29 6
Ну ты как-то записываешь в файл набор записейи затем симметричным образом его считываешь. Просто в общем смысле я не могу, в чём у тебя непонятка. Лучше задай что-либо поконкретнее
0
22.06.2009, 14:29
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.06.2009, 14:29
Помогаю со студенческими работами здесь

Обработка файлов произвольного доступа
Создать файл, содержащий массив указателей на упорядоченные в алфавитном порядке строки,...

Deque - сложность произвольного доступа
Тут написано: как так? Я привык считать, что дек - хранится двусвязным списком....

Пишу итератор произвольного доступа
Пишу итератор произвольного доступа. По минимуму он должен поддерживать несколько операций, но меня...

Создание файла произвольного доступа
Здравствуйте.Ни как не могу разобраться с файлами произвольного доступа.Но эта тема посвящена...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru