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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.61
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,508
03.07.2011, 14:36     Файл произвольного доступа #1
Очень прошу помощи так как не могу с ними разобраться который день, видать делаю одну и ту же ошибку но не нахожу. Создаю свой класс и потом когда пытаюсь его записать и считать возникают ошибки.
Ну да наверное проще начать обо всём по порядку чтобы не запутывать.

Проблема первая: файл каждый раз после записи 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));
}
Очень прошу помочь разобраться.
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Bers
Заблокирован
04.07.2011, 14:38     Файл произвольного доступа #21
Чорт попозже буду
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
04.07.2011, 18:56     Файл произвольного доступа #22
Цитата Сообщение от Gepar Посмотреть сообщение
Есть ли в с++ для этого функции
rename
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,508
08.07.2011, 01:25  [ТС]     Файл произвольного доступа #23
easybudda, годиться, а теперь бы ещё чего подобного на удаление файла (задача обновить старый файл новым, то есть удалить старый и переименовать новый чтобы он назывался так же как и старый).
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
08.07.2011, 01:28     Файл произвольного доступа #24
Цитата Сообщение от Gepar Посмотреть сообщение
а теперь бы ещё чего подобного на удаление файла
remove
пример
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,508
08.07.2011, 12:22  [ТС]     Файл произвольного доступа #25
Годиться, сейчас попробую применить.
Ну и ещё один вопрос что возник при чтении книги: а как-то можно указать постоянные пути к файлу? Пробовал писать что-то вроде open("c:\1.txt",ios::int) но оно хоть и компилируется, но файл не видит тогда ни в корне диска с, ни в папке с программой, подозреваю что оно начинает искать в папке с программой файл с именем "c:\1.txt" и не находит его.
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
08.07.2011, 12:25     Файл произвольного доступа #26
Gepar, Поставь двойной бэкслеш: c:\\1.txt
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,508
08.07.2011, 16:00  [ТС]     Файл произвольного доступа #27
А вот ещё пока класс пишу возник вопрос: как почистить файл от данных (файл последовательного доступа, просто символьные данные в нём). Можно бы закрыть файл и открыть файл снова например (ios::out) и тогда всё содержимое должно убраться, но так как планируется это делать из функции то тогда вопрос связанный с этим: как узнать в функции какой же файл ей передан ?Есть функция например
void del(fstream& file), как же узнать что этот file является моим 1.txt например? Тогда бы я смог его закрыть и открыть в функции снова например чтобы почистить, хотя может есть и просто функция чтобы файл очистить то?

Добавлено через 4 минуты
asics, так работает, странно что я сам с двумя слешами не додумался попробовать файл открывать.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
08.07.2011, 16:04     Файл произвольного доступа #28
Цитата Сообщение от Gepar Посмотреть сообщение
может есть и просто функция чтобы файл очистить то?
truncate
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,508
09.07.2011, 19:06  [ТС]     Файл произвольного доступа #29
А узнать из функции что за файл ей передали всё же можно (получая только файл)? Это так, для общего развития, ну там например чтобы функция print выводила в начале название файла что она печатает, только именно функция, а не в main там перед тем как печатать файл уже. Возможность получить название класса объект которого получен есть ведь, вот думаю и здесь может всё же что-то есть изначально.

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

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

Добавлено через 51 минуту
И ещё маленький вопрос (надеюсь не задолбал я всех ещё ): есть ли какая функция для работы с файлами чтобы убирала сразу и конец файла и устанавливала курсор в начало файла? Я постоянно то забуду курсор перевести то метку конца файла сбросить и потом сижу ищу где я протупил, было бы хорошо будь одна функция делающая и первое и второе.
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
09.07.2011, 19:11     Файл произвольного доступа #30
Цитата Сообщение от Gepar Посмотреть сообщение
есть ли какая функция для работы с файлами чтобы убирала сразу и конец файла и устанавливала курсор в начало файла?
http://www.cplusplus.com/reference/i...istream/seekg/
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
09.07.2011, 23:00     Файл произвольного доступа #31
Цитата Сообщение от Gepar Посмотреть сообщение
Что-то не подключается этот truncate с #include <unistd.h>
Снесите винду, установите какой-нибудь линух - подключится.
Ну или попробуйте это использовать...

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

asics, ну мне приходится пользоваться seekg / seekp + приходится чистить конец файла с помощью file.clear. Когда перестанавливаешь курсор конец файла не убирается же так что после переустановки курсора через seekg(0) цикл while(!file.eof()) выполняться не будет так как конец файла уже установлен в 1. Иными словами seekg(0) не убирает метку конца файла вот я и хотел бы как-то хитро чтобы и конец файла убирало и в начало файла переставляло.
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,508
11.07.2011, 07:37  [ТС]     Файл произвольного доступа #33
Цитата Сообщение от easybudda Посмотреть сообщение
Ну или попробуйте это использовать...
Это уже винапи, слишком как-то как для обыкновеннейшей очистки файла от данных.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
11.07.2011, 10:21     Файл произвольного доступа #34
Цитата Сообщение от 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;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.07.2011, 12:17     Файл произвольного доступа
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,508
11.07.2011, 12:17  [ТС]     Файл произвольного доступа #35
easybudda, не, си тоже не пойдёт, когда так открываешь файл то теряешь возможность писать в него всё скопом через ввод в поток вида f<<infromation<<endl<<... Я видел что у си там побольше возможностей по открытию файла.
Yandex
Объявления
11.07.2011, 12:17     Файл произвольного доступа
Ответ Создать тему
Опции темы

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