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

fwrite\fread: чтение и запись в бинарные файлы - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.69
Gerbasha
6 / 6 / 1
Регистрация: 04.10.2011
Сообщений: 115
18.05.2013, 22:27     fwrite\fread: чтение и запись в бинарные файлы #1
Добрый день. Пытаюсь разобратся с чтением и записью в бинарные файлы.. в общем обрисую в краце проблему, записываю класс.
C++
1
2
3
4
5
class tPoint
{
private:
    float mX,mY;
        float* mDescriptor;
Реализовал метод Write
C++
1
2
3
        fwrite(&mX,sizeof(float),1,f);
        fwrite(&mY,sizeof(float),1,f);
        fwrite(&mDescriptor,sizeof(float),1,f);
Первые две запиываются и считываются нормально. но mDescriptor имеет тип float* и считать его невыходят.
При дыбаге данных в ней нет. Остальные данные считываются.
Собсвеено вопрос. что я делюа не так, и как это исправить.
PS спасибо за быстрый ответ.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.05.2013, 22:27     fwrite\fread: чтение и запись в бинарные файлы
Посмотрите здесь:

Бинарные файлы, чтение и запись C++
C++ Бинарные чтение/запись объектов
C++ Запись в бинарные файлы
Бинарные запись и чтение структуры в файл C++
C++ Функции fread() и fwrite()
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
NoMasters
Псевдослучайный
1737 / 1080 / 69
Регистрация: 13.09.2011
Сообщений: 3,093
18.05.2013, 22:53     fwrite\fread: чтение и запись в бинарные файлы #2
Размер указателя может отличаться от размера типа, там мог бы быть sizeof(float*).
Однако, запись указателя в файл — вообще малополезное занятие, актуальными значения будут только в пределах одного запуска программы.
Gerbasha
6 / 6 / 1
Регистрация: 04.10.2011
Сообщений: 115
18.05.2013, 23:48  [ТС]     fwrite\fread: чтение и запись в бинарные файлы #3
Запись и чтение просиходит на РАЗНЫХ комьютерах. А как запись значения из указателя.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.05.2013, 00:22     fwrite\fread: чтение и запись в бинарные файлы #4
C++
1
fwrite(mDescriptor,sizeof(float),1,f);
Gerbasha
6 / 6 / 1
Регистрация: 04.10.2011
Сообщений: 115
19.05.2013, 13:12  [ТС]     fwrite\fread: чтение и запись в бинарные файлы #5
Пробывал не работает
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.05.2013, 13:41     fwrite\fread: чтение и запись в бинарные файлы #6
Цитата Сообщение от Gerbasha Посмотреть сообщение
Пробывал не работает
Я думаю, проблема в том, что под указателем нет памяти и он ни на что не указывает, поэтому в файл пишите мусор. Он у вас на что должен указывать?
Gerbasha
6 / 6 / 1
Регистрация: 04.10.2011
Сообщений: 115
19.05.2013, 13:54  [ТС]     fwrite\fread: чтение и запись в бинарные файлы #7
НУ на флот переменную, дескрпитор, прохожу в режиме дебага в переменной значения есть.

Добавлено через 10 минут
Цитата Сообщение от alsav22 Посмотреть сообщение
Я думаю, проблема в том, что под указателем нет памяти и он ни на что не указывает, поэтому в файл пишите мусор. Он у вас на что должен указывать?
Спасибо ваш коментарйи наталкнлу на мысыль. В общем решил проблему так:
C++
1
2
3
float Descriptor; 
        fread(&Descriptor,sizeof(float),1,f);
        mDescriptor=&Descriptor;
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.05.2013, 14:09     fwrite\fread: чтение и запись в бинарные файлы #8
Цитата Сообщение от Gerbasha Посмотреть сообщение
В общем решил проблему так:
Это все очень криво. Не видно как объекты класса создаются. Если поле класса указатель, то под него, в конструкторе, память обычно выделяется. А если память выделена, то в неё уже можно читать из файла, а не создавать дополнительную переменную, адрес которой присваивается полю-указателю.

Добавлено через 3 минуты
Это код только для проверки (как приблизительно должно выглядеть):
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
class tPoint
{
private:
    float mX,mY;
    float *mDescriptor;
public:
    tPoint()
    {
        mX = 0.0;
        mY = 0.0;
        mDescriptor = new float(0.0);
    }
 
    tPoint(float x, float y, float z)
    {
        mX = x;
        mY = y;
        mDescriptor = new float(z);
    }
 
    void Write(FILE *f)
    {
        fwrite(&mX, sizeof(float), 1, f);
        fwrite(&mY, sizeof(float), 1, f);
        fwrite(mDescriptor, sizeof(float), 1, f);
    }
 
    void Read(FILE *f)
    {
        fread(&mX, sizeof(float), 1, f);
        fread(&mY, sizeof(float), 1, f);
        fread(mDescriptor, sizeof(float), 1, f);
       }
       
     void Print()
     {
        printf("%f\n",  mX);
        printf("%f\n", mY);
        printf("%f\n", *mDescriptor);
     }
};
 
int main()
{
 
    tPoint obj(5.0, 5.0, 5.0);
    FILE *f;
    f = fopen("info.dat", "wb");
    obj.Write(f);
    fclose(f);
    
    tPoint obj2;
    f = fopen("info.dat", "rb");
    obj2.Read(f);
    fclose(f);
               obj2.Print();
              
 return 0;
}
Gerbasha
6 / 6 / 1
Регистрация: 04.10.2011
Сообщений: 115
19.05.2013, 14:30  [ТС]     fwrite\fread: чтение и запись в бинарные файлы #9
Добавлено через 3 минуты
Это код только для проверки (как приблизительно должно выглядеть):

Спасибо так и реализовал, вывод не пускайте джавистов к с++ разработке)
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.05.2013, 14:33     fwrite\fread: чтение и запись в бинарные файлы #10
Но тут не всё так просто. Нужно предусмотреть освобождение памяти под указателем в деструкторе, и сделать явные конструкторы копирования и присваивания (для глубокого копирования/присваивания). Иначе будут проблемы.
RimoBlack
5 / 5 / 0
Регистрация: 20.10.2009
Сообщений: 110
21.05.2013, 15:21     fwrite\fread: чтение и запись в бинарные файлы #11
А подскажите ещё такой момент, как правильно сделать поиск-замену по файлу.
Есть у меня некая структура, я по циклу перебираю записи в файле, нахожу необходимую, меняю значения переменных в структуре и записываю на то-же место в файле, но происходит что-то не то.

Что я хотел бы знать.
C++
1
2
3
4
fread(&mystruct,sizeof(mystruct),1,fp); // считал блок, указатель переместился на следующую запись в файле
.......поменял данные в mystruct
fseek(fp,-(sizeof(mystruct)),SEEK_CUR); // переместил указатель на прочитанную в прошлой строке позицию
fwrite(&mystruct,sizeof(mystruct),1,fp); // перезаписал на старое место измененные данные
если это положить в цикл, будет оно каждый последующий блок менять?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.05.2013, 15:32     fwrite\fread: чтение и запись в бинарные файлы #12
Для перемещения курсора не применяйте -sizeof(). Вот так попробуйте:
C++
1
2
int pos = sizeof(mystruct);
fseek(fp, -pos, SEEK_CUR);
RimoBlack
5 / 5 / 0
Регистрация: 20.10.2009
Сообщений: 110
21.05.2013, 15:37     fwrite\fread: чтение и запись в бинарные файлы #13
Цитата Сообщение от alsav22 Посмотреть сообщение
Для перемещения курсора не применяйте -sizeof(). Вот так попробуйте:
C++
1
2
int pos = sizeof(mystruct);
fseek(fp, -pos, SEEK_CUR);
Спасибо, похоже именно в этом и была ошибка, вроде заработало как надо.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.05.2013, 15:45     fwrite\fread: чтение и запись в бинарные файлы #14
Просто sizeof() возвращает число без знака и компилятор не хочет ему минус приделывать. Получается перемещение не назад, а вперёд.
RimoBlack
5 / 5 / 0
Регистрация: 20.10.2009
Сообщений: 110
21.05.2013, 15:49     fwrite\fread: чтение и запись в бинарные файлы #15
Однако что-то всё-равно не так, происходит что-то непонятное.
Такое впечатление что fwrite не перезаписывает данные, а вставляет в ту позицию куда был установлен fseek, причем длина файла не меняется.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.05.2013, 15:53     fwrite\fread: чтение и запись в бинарные файлы #16
Как видите это всё?

Добавлено через 1 минуту
После записи делайте:
C++
1
fflush(fp);
Это чтобы записанное из буфера в файл попало.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.05.2013, 16:04     fwrite\fread: чтение и запись в бинарные файлы
Еще ссылки по теме:

Бинарные файлы. Чтение C++
Аналог С функции fread и fwrite в С++ C++
C++ Как работают функции fwrite и fread

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

Или воспользуйтесь поиском по форуму:
RimoBlack
5 / 5 / 0
Регистрация: 20.10.2009
Сообщений: 110
21.05.2013, 16:04     fwrite\fread: чтение и запись в бинарные файлы #17
Цитата Сообщение от alsav22 Посмотреть сообщение
Как видите это всё?

Добавлено через 1 минуту
После записи делайте:
C++
1
fflush(fp);
Это чтобы записанное из буфера в файл попало.
И снова в точку! Я в процессе работы программы следил за выходным файлом, после fwrite там ничего не менялось, менялось только после fclose.
Таким же макаром я с 'cin' бился, пока flush не применил))
Yandex
Объявления
21.05.2013, 16:04     fwrite\fread: чтение и запись в бинарные файлы
Ответ Создать тему
Опции темы

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