Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
tube
0 / 0 / 0
Регистрация: 24.09.2008
Сообщений: 26
22.06.2009, 13:51     Файл произвольного доступа #1
Здравствуйте, снова к файлам, такая задача.
Допустим, у меня есть текстовый файл с данными - код, название, количество, и со значениями по умолчанию - 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 здесь неправильно работает).
Как в этом случае поступить?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.06.2009, 13:51     Файл произвольного доступа
Посмотрите здесь:

Дан файл произвольного типа. Создать его копию с новым именем. C++
C++ Создание файла произвольного доступа.
C++ Файл последовательного доступа
Файл произвольного доступа C++
C++ Файл произвольного доступа
C++ Не могу прочитать файл произвольного доступа с конца
C++ В чем ошибка(файлы произвольного доступа)
C++ Корень произвольного степени из произвольного числа, введенного с клавиатуры
C++ Файл последовательного доступа
Пишу итератор произвольного доступа C++
C++ Детектировать итератор произвольного доступа
Создание файла произвольного доступа C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
RazorQ
 Аватар для RazorQ
576 / 343 / 9
Регистрация: 06.02.2009
Сообщений: 1,386
22.06.2009, 13:59     Файл произвольного доступа #2
Открой файл в двоичном режиме.
tube
0 / 0 / 0
Регистрация: 24.09.2008
Сообщений: 26
22.06.2009, 14:06  [ТС]     Файл произвольного доступа #3
Цитата Сообщение от RazorQ Посмотреть сообщение
Открой файл в двоичном режиме.
ios::binary никаких видимых изменений к лучшему не производит.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16946 / 5351 / 329
Регистрация: 30.03.2009
Сообщений: 14,389
Записей в блоге: 26
22.06.2009, 14:07     Файл произвольного доступа #4
Если я правильно понял постановку задачи, то по простому её можно решить, задав фиксированный размер всем записям. Т.е. у тебя есть структура типа

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

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

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

Ну и самый правильный вариант - это работать таким же образом, как работают системы упарвления базами данных. Тут надо долго разбираться с тем, как они организуют работу с хранением данный в файле и т.п. Поскольку у тебя врядли стоИт задача обрабатывать десятки гигабайт данных, то такой вариант для тебя отпадает
tube
0 / 0 / 0
Регистрация: 24.09.2008
Сообщений: 26
22.06.2009, 14:28  [ТС]     Файл произвольного доступа #5
Цитата Сообщение от Evg Посмотреть сообщение
по простому её можно решить, задав фиксированный размер всем записям
С такой реализацией понятно, спасибо, а вот более продвинутый вариант, считывающий файл целиком - можно поподробнее? Каким образом это осуществляется?
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16946 / 5351 / 329
Регистрация: 30.03.2009
Сообщений: 14,389
Записей в блоге: 26
22.06.2009, 14:29     Файл произвольного доступа #6
Ну ты как-то записываешь в файл набор записейи затем симметричным образом его считываешь. Просто в общем смысле я не могу, в чём у тебя непонятка. Лучше задай что-либо поконкретнее
Yandex
Объявления
22.06.2009, 14:29     Файл произвольного доступа
Ответ Создать тему
Опции темы

Текущее время: 00:50. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru