0 / 0 / 0
Регистрация: 24.09.2008
Сообщений: 26

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

22.06.2009, 13:51. Показов 1579. Ответов 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 здесь неправильно работает).
Как в этом случае поступить?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.06.2009, 13:51
Ответы с готовыми решениями:

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

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

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

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

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  [ТС]
Цитата Сообщение от Evg Посмотреть сообщение
по простому её можно решить, задав фиксированный размер всем записям
С такой реализацией понятно, спасибо, а вот более продвинутый вариант, считывающий файл целиком - можно поподробнее? Каким образом это осуществляется?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
22.06.2009, 14:29
Ну ты как-то записываешь в файл набор записейи затем симметричным образом его считываешь. Просто в общем смысле я не могу, в чём у тебя непонятка. Лучше задай что-либо поконкретнее
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.06.2009, 14:29
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

Новые блоги и статьи
Непрерывная интеграция для пакета Python
Mr. Docker 22.06.2025
Было 4 часа утра пятницы, когда я выпустил новую версию нашей внутренней библиотеки для обработки данных. Релиз 0. 5. 2 содержал небольшой фикс для обработки дат в ISO формате, что может пойти не так?. . .
Продвинутый ETL на C# из OLTP БД в хранилище
stackOverflow 22.06.2025
Работая в сфере корпоративной аналитики, я постоянно сталкиваюсь с одним и тем же - нужны чистые, структурированные и, главное, свежие данные. Без них современные аналитические системы, машинное. . .
Мастер-класс по микросервисам на Node.js
Reangularity 21.06.2025
Node. js стал одной из самых популярных платформ для микросервисной архитектуры не случайно. Его неблокирующая однопоточная модель и событийно-ориентированный подход делают его идеальным для. . .
Управление Arduino из WPF приложения
Wired 21.06.2025
Зачем вообще связывать Arduino с WPF-приложением? Казалось бы, у Arduino есть собственная среда разработки, своя экосистема, свои способы управления. Однако при создании серьезных проектов. . .
Звёздная пыль
kumehtar 20.06.2025
Я просто это себе представляю: как создавался этот мир. Как энергия слипалась в маленькие частички. Как они собирались в первые звёзды, как во вселенной впервые появился Свет. Как эти звёзды. . .
Создание нейросети с PyTorch
AI_Generated 19.06.2025
Ключевое преимущество PyTorch — его питоновская натура. В отличие от TensorFlow, который изначально был построен как статический вычислительный граф, PyTorch предлагает динамический подход. Это. . .
JWT аутентификация в ASP.NET Core
UnmanagedCoder 18.06.2025
Разрабатывая веб-приложения, я постоянно сталкиваюсь с дилеммой: как обеспечить надежную аутентификацию пользователей без ущерба для производительности и масштабируемости? Классические подходы на. . .
Краткий курс по С#
aaLeXAA 18.06.2025
Здесь вы найдете все необходимые функции чтоб написать програму на C# Задание 1: КЛАСС FORM 1 public partial class Form1 : Form { Spisok listin = new Spisok(); . . .
50 самых полезных примеров кода Python для частых задач
py-thonny 17.06.2025
Эффективность работы разработчика часто измеряется не количеством написаных строк, а скоростью решения задач. Готовые сниппеты значительно ускоряют разработку, помогают избежать типичных ошибок и. . .
C# и продвинутые приемы работы с БД
stackOverflow 17.06.2025
Каждый . NET разработчик рано или поздно сталкивается с ситуацией, когда привычные методы работы с базами данных превращаются в источник бессонных ночей. Я сам неоднократно попадал в такие ситуации,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru