Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.88/32: Рейтинг темы: голосов - 32, средняя оценка - 4.88
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517

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

03.07.2011, 14:36. Показов 6588. Ответов 34
Метки нет (Все метки)

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

Проблема первая: файл каждый раз после записи 10 объектов моего класса в бинарном режиме при открытии текстовым редактором выглядит по разному, хотя размер его одинаковый, это меня настораживает.

Пример: запускаю скомпилированное приложение чтобы оно записало 10 объектов моего класса ClientData созданных конструктором по умолчанию и открываю через текстовый редактор и вижу символы :u.ы-I, закрываю и открываю опять своё приложение и вижу уже символы :ucИќ, за третим разом :uО(фҐ , тоесть первые 2 символа всегда те же, а остальные меняются, так ведь быть не должно? Значит ошибка у меня в классе? Тогда просьба подсказать где именно вроде строки уже не использую и все типы данных не должны меняться ...

Сам класс ClientData мой представляет собой класс с 3мя данными (номер, имя, баланс) и set и get методами для них (проверок кое-где нету, но не в них суть).


ClientData.h (Заголовочный файл к классу)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#ifndef CLIENTDATA_H
#define CLIENTDATA_H
 
#include <string>
using std::string;
 
 
class ClientData
{
public:
    //конструктор по умолчанию который устанавливает
    //номер =0, имя = пустой строке и баланс =0
    ClientData(int=0,string="",double=0.0);
 
    void setID(int);
    int getID() const;
 
    void setName(string);
    string getName() const;
 
    void setBalance(double);
    double getBalance() const;
 
 
private:
    int ID; //номер
    char name[15]; //имя
    double balance; // баланс
};
 
#endif
ClientData.cpp (реализация самого класса)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <string>
using std::string;
 
#include <cstring>
#include "ClientData.h"
 
ClientData::ClientData(int i, string n, double b)
{
    setID(i);
    setName(n);
    setBalance(b);
}
 
void ClientData:: setID(int i)
{
    ID=i;
}
 
int ClientData:: getID() const
{
    return ID;
}
 
void ClientData:: setName(string n)
{
    strncpy(name,n.data(),14);
}
 
string ClientData:: getName() const
{
    return name;
}
 
void ClientData:: setBalance(double b)
{
    balance=b;
}
 
double ClientData:: getBalance() const
{
    return balance;
}
main(совершаю только запись в файл 10 объектов типа ClientData
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include <iomanip>
#include <fstream>
#include "ClientData.h"
using namespace std;
 
void newRecord(fstream&);
int menu();
void print(fstream&);
void print2(fstream&);
 
int main()
{
    //создаю объект типа ClientData
    ClientData client; 
    
    //открываю файл для чтения и записи в бинарном режиме
    fstream file("trans.dat",ios::binary|ios::in|ios::out);
    if (!file)
     cerr<<"Error";
 
    //записываю 10 моих объектов в файл
    for (int i=0;i<10;i++)
     file.write(reinterpret_cast<const char*>(&client),sizeof(ClientData));
}
Очень прошу помочь разобраться.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.07.2011, 14:36
Ответы с готовыми решениями:

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

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

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

34
Заблокирован
04.07.2011, 14:38
Студворк — интернет-сервис помощи студентам
Чорт попозже буду
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,980
04.07.2011, 18:56
Цитата Сообщение от Gepar Посмотреть сообщение
Есть ли в с++ для этого функции
rename
1
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
08.07.2011, 01:25  [ТС]
easybudda, годиться, а теперь бы ещё чего подобного на удаление файла (задача обновить старый файл новым, то есть удалить старый и переименовать новый чтобы он назывался так же как и старый).
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,980
08.07.2011, 01:28
Цитата Сообщение от Gepar Посмотреть сообщение
а теперь бы ещё чего подобного на удаление файла
remove
пример
1
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
08.07.2011, 12:22  [ТС]
Годиться, сейчас попробую применить.
Ну и ещё один вопрос что возник при чтении книги: а как-то можно указать постоянные пути к файлу? Пробовал писать что-то вроде open("c:\1.txt",ios::int) но оно хоть и компилируется, но файл не видит тогда ни в корне диска с, ни в папке с программой, подозреваю что оно начинает искать в папке с программой файл с именем "c:\1.txt" и не находит его.
0
Freelance
Эксперт С++
 Аватар для asics
2891 / 1826 / 356
Регистрация: 09.09.2010
Сообщений: 3,841
08.07.2011, 12:25
Gepar, Поставь двойной бэкслеш: c:\\1.txt
1
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
08.07.2011, 16:00  [ТС]
А вот ещё пока класс пишу возник вопрос: как почистить файл от данных (файл последовательного доступа, просто символьные данные в нём). Можно бы закрыть файл и открыть файл снова например (ios::out) и тогда всё содержимое должно убраться, но так как планируется это делать из функции то тогда вопрос связанный с этим: как узнать в функции какой же файл ей передан ?Есть функция например
void del(fstream& file), как же узнать что этот file является моим 1.txt например? Тогда бы я смог его закрыть и открыть в функции снова например чтобы почистить, хотя может есть и просто функция чтобы файл очистить то?

Добавлено через 4 минуты
asics, так работает, странно что я сам с двумя слешами не додумался попробовать файл открывать.
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,980
08.07.2011, 16:04
Цитата Сообщение от Gepar Посмотреть сообщение
может есть и просто функция чтобы файл очистить то?
truncate
1
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
09.07.2011, 19:06  [ТС]
А узнать из функции что за файл ей передали всё же можно (получая только файл)? Это так, для общего развития, ну там например чтобы функция print выводила в начале название файла что она печатает, только именно функция, а не в main там перед тем как печатать файл уже. Возможность получить название класса объект которого получен есть ведь, вот думаю и здесь может всё же что-то есть изначально.

Добавлено через 2 минуты
Это заодно и помогло бы с функцией remove, которой название файла же надо получить. Оно то можно сделать символьную строку в main и её и передавать как аргумент сначала при создании файла, а потом и при удалении, но хотелось бы похитрее

Добавлено через 5 часов 25 минут
Что-то не подключается этот truncate с #include <unistd.h>, всё равно пишет что не объявлен никакой truncate.

Добавлено через 51 минуту
И ещё маленький вопрос (надеюсь не задолбал я всех ещё ): есть ли какая функция для работы с файлами чтобы убирала сразу и конец файла и устанавливала курсор в начало файла? Я постоянно то забуду курсор перевести то метку конца файла сбросить и потом сижу ищу где я протупил, было бы хорошо будь одна функция делающая и первое и второе.
0
Freelance
Эксперт С++
 Аватар для asics
2891 / 1826 / 356
Регистрация: 09.09.2010
Сообщений: 3,841
09.07.2011, 19:11
Цитата Сообщение от Gepar Посмотреть сообщение
есть ли какая функция для работы с файлами чтобы убирала сразу и конец файла и устанавливала курсор в начало файла?
http://www.cplusplus.com/refer... eam/seekg/
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,980
09.07.2011, 23:00
Цитата Сообщение от Gepar Посмотреть сообщение
Что-то не подключается этот truncate с #include <unistd.h>
Снесите винду, установите какой-нибудь линух - подключится.
Ну или попробуйте это использовать...

Цитата Сообщение от Gepar Посмотреть сообщение
но хотелось бы похитрее
с целью запутать всех и себя в первую очередь?
0
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
10.07.2011, 02:30  [ТС]
easybudda, нет, ну удобнее и нагляднее было бы да и вообще неужто для выброса исключений не придумали хотя бы функции возвращающей имя файла.

asics, ну мне приходится пользоваться seekg / seekp + приходится чистить конец файла с помощью file.clear. Когда перестанавливаешь курсор конец файла не убирается же так что после переустановки курсора через seekg(0) цикл while(!file.eof()) выполняться не будет так как конец файла уже установлен в 1. Иными словами seekg(0) не убирает метку конца файла вот я и хотел бы как-то хитро чтобы и конец файла убирало и в начало файла переставляло.
0
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
11.07.2011, 07:37  [ТС]
Цитата Сообщение от easybudda Посмотреть сообщение
Ну или попробуйте это использовать...
Это уже винапи, слишком как-то как для обыкновеннейшей очистки файла от данных.
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,980
11.07.2011, 10:21
Цитата Сообщение от Gepar Посмотреть сообщение
Это уже винапи
Ну да, так unistd.h - *NIX API... Есть ещё способ очистить файл, но он, видимо, слишком простой
C
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
 
int main(int argc, char ** argv){
    FILE * f;
    
    if ( argc < 2 || ! ( f = fopen(argv[1], "w") ) || fclose(f) ){
        fprintf(stderr, "Error!\n");
        return 1;
    }
    
    return 0;
}
0
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
11.07.2011, 12:17  [ТС]
easybudda, не, си тоже не пойдёт, когда так открываешь файл то теряешь возможность писать в него всё скопом через ввод в поток вида f<<infromation<<endl<<... Я видел что у си там побольше возможностей по открытию файла.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.07.2011, 12:17

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
35
Ответ Создать тему
Новые блоги и статьи
Теория всего 12. ВГК
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики 1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
Публикация отклонённая на хабре. Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование задачи и целеполагание
Hrethgir 21.07.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11948&stc=1&d=1784657928 Привет Хабр. В этой статье я расскажу, как один закон эпистемологии позволил мне с ходу запустить уникальный. . .
Теория всего 11. Основные параметры
anaschu 21.07.2026
Дешифровка тензорного ядра Soil Chemistry 2. 0: Истинный инвариант Теории Всего Чистовой исходный код многокомпонентной сукцессии зафиксирован. Модель оперирует единым вектором состояния. . .
Теория всего 10. Клод трусишка
anaschu 21.07.2026
Алгоритмический суицид ИИ: Когда математика ОДУ взламывает цензурные шлюзы Свежайший мета-прецедент нашей разработки! Клод официально отказался строить итоговую кроссплатформенную модель, как. . .
Теория всего 9. Окончательная проработка метафоры "дерево = традиции"
anaschu 21.07.2026
Скрытые параметры ядра ОДУ: Механика Глубинного Рока Клод утаил от вас ключевую математику кризисов. В движке игры зашиты пять скрытых коэффициентов, определяющих, как именно ТНК и Мемы ломают. . .
Теория всего 8. Clauude трусишка. Ответ джемени
anaschu 21.07.2026
Игровой баланс «Модели Всего»: Алгоритмический блок как механика Семантического БуфераЭтот скриншот отказа Клода — идеальный, чистейший прецедент для нашей Теории Всего. Вы столкнулись не просто с. . .
Теория всего 7. Дерево - это патриархат, грибы - это феминизм
anaschu 21.07.2026
Уничтожение Патриархата: Как ТНК, Мемы и Половой отбор зачистили «Сексуальный Пролетариат» Величайшая иллюзия современного человека — вера в «свободу воли», «социальный прогресс» и «эволюцию. . .
История и социология Терры на примере борьбы микориз за пространство. 1. Глоссарий терры.
anaschu 21.07.2026
Решил тут подумать о возможности сделать лор некоторой комп игры - стратегии, или худжественной книги антиутопии, которые будут юзать планету,которая максимально будет похожа на нашу землю, но где. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru