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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
tube
0 / 0 / 0
Регистрация: 24.09.2008
Сообщений: 26
#1

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

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

Здравствуйте, снова к файлам, такая задача.
Допустим, у меня есть текстовый файл с данными - код, название, количество, и со значениями по умолчанию - 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++
Странное происходит в функции read_file, а именно не работает seekg. Почему-то читается всё время последнее значение. Почему так и что с...

Детектировать итератор произвольного доступа - C++
здравствуйте, нужно детектировать итератор произвольного доступа... это не работает: template&lt; typename... &gt; using void_t = void; ...

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

Создание файла произвольного доступа. - C++
#include &lt;iostream.h&gt; #include &lt;fstream.h&gt; #include &lt;stdlib.h&gt; #define number 100 struct clientData { int acctNum; ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
RazorQ
577 / 344 / 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
Эксперт CАвтор FAQ
17536 / 5774 / 370
Регистрация: 30.03.2009
Сообщений: 15,891
Записей в блоге: 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 Посмотреть сообщение
по простому её можно решить, задав фиксированный размер всем записям
С такой реализацией понятно, спасибо, а вот более продвинутый вариант, считывающий файл целиком - можно поподробнее? Каким образом это осуществляется?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.06.2009, 14:29     Файл произвольного доступа
Еще ссылки по теме:

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

В чем ошибка(файлы произвольного доступа) - C++
#include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;Windows.h&gt; using namespace std; struct PHONE { char Company;//комания ...

Корень произвольного степени из произвольного числа, введенного с клавиатуры - C++
Не применяя встроенных функций, найти корень произвольного степени из произвольного числа, введенного с клавиатуры. Из четырех первых цифр...

Дан файл произвольного типа. Создать его копию с новым именем. - C++
Дан файл произвольного типа. Создать его копию с новым именем.Пожалуйста, напишите в Borland C++ 3.11 Добавлено через 2 часа 44 минуты...

Файл последовательного доступа - C++
Ребят, не могу понять как делать и препод ничего толком не объясняет: Заполнить файл последовательного доступа N действительными...

Файл последовательного доступа - C++
Здрасте всем. Есть два вопроса. В описанном ниже файле 1) как сделать так, чтобы данные сначала выходили в одну строчку после ввода. Плюс...


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

Или воспользуйтесь поиском по форуму:
Evg
Эксперт CАвтор FAQ
17536 / 5774 / 370
Регистрация: 30.03.2009
Сообщений: 15,891
Записей в блоге: 26
22.06.2009, 14:29     Файл произвольного доступа #6
Ну ты как-то записываешь в файл набор записейи затем симметричным образом его считываешь. Просто в общем смысле я не могу, в чём у тебя непонятка. Лучше задай что-либо поконкретнее
Yandex
Объявления
22.06.2009, 14:29     Файл произвольного доступа
Ответ Создать тему
Опции темы

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