Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.79/14: Рейтинг темы: голосов - 14, средняя оценка - 4.79
Gerbasha
6 / 6 / 2
Регистрация: 04.10.2011
Сообщений: 115
1

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

18.05.2013, 22:27. Просмотров 2686. Ответов 16
Метки нет (Все метки)

Добрый день. Пытаюсь разобратся с чтением и записью в бинарные файлы.. в общем обрисую в краце проблему, записываю класс.
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 спасибо за быстрый ответ.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.05.2013, 22:27
Ответы с готовыми решениями:

Бинарные файлы, чтение и запись
Доброго времени суток. Подскажите пожалуйста, как организовать побайтовое...

Функции fread() и fwrite()
Меня интересует что это за "счётчик" в этих функциях fwrite( massiv, *size_int...

Аналог С функции fread и fwrite в С++
Здравствуйте, какие есть аналоги функций fread() fwrite в С++?

Как работают функции fwrite и fread
объясните мне пожалуйста функции fwrite и fread.Буду очень благодарен!:scratch:

как работает fwrite() и fread() со структурой?
Добрый день, у меня вопрос: 1) Каким образом я могу записать структуру в файл...

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

Добавлено через 10 минут
Цитата Сообщение от alsav22 Посмотреть сообщение
Я думаю, проблема в том, что под указателем нет памяти и он ни на что не указывает, поэтому в файл пишите мусор. Он у вас на что должен указывать?
Спасибо ваш коментарйи наталкнлу на мысыль. В общем решил проблему так:
C++
1
2
3
float Descriptor; 
        fread(&Descriptor,sizeof(float),1,f);
        mDescriptor=&Descriptor;
0
alsav22
5442 / 4837 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
19.05.2013, 14:09 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;
}
1
Gerbasha
6 / 6 / 2
Регистрация: 04.10.2011
Сообщений: 115
19.05.2013, 14:30  [ТС] 9
Добавлено через 3 минуты
Это код только для проверки (как приблизительно должно выглядеть):

Спасибо так и реализовал, вывод не пускайте джавистов к с++ разработке)
0
alsav22
5442 / 4837 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
19.05.2013, 14:33 10
Но тут не всё так просто. Нужно предусмотреть освобождение памяти под указателем в деструкторе, и сделать явные конструкторы копирования и присваивания (для глубокого копирования/присваивания). Иначе будут проблемы.
0
RimoBlack
6 / 6 / 1
Регистрация: 20.10.2009
Сообщений: 111
21.05.2013, 15:21 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); // перезаписал на старое место измененные данные
если это положить в цикл, будет оно каждый последующий блок менять?
0
alsav22
5442 / 4837 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.05.2013, 15:32 12
Для перемещения курсора не применяйте -sizeof(). Вот так попробуйте:
C++
1
2
int pos = sizeof(mystruct);
fseek(fp, -pos, SEEK_CUR);
0
RimoBlack
6 / 6 / 1
Регистрация: 20.10.2009
Сообщений: 111
21.05.2013, 15:37 13
Цитата Сообщение от alsav22 Посмотреть сообщение
Для перемещения курсора не применяйте -sizeof(). Вот так попробуйте:
C++
1
2
int pos = sizeof(mystruct);
fseek(fp, -pos, SEEK_CUR);
Спасибо, похоже именно в этом и была ошибка, вроде заработало как надо.
0
alsav22
5442 / 4837 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.05.2013, 15:45 14
Просто sizeof() возвращает число без знака и компилятор не хочет ему минус приделывать. Получается перемещение не назад, а вперёд.
0
RimoBlack
6 / 6 / 1
Регистрация: 20.10.2009
Сообщений: 111
21.05.2013, 15:49 15
Однако что-то всё-равно не так, происходит что-то непонятное.
Такое впечатление что fwrite не перезаписывает данные, а вставляет в ту позицию куда был установлен fseek, причем длина файла не меняется.
0
alsav22
5442 / 4837 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.05.2013, 15:53 16
Как видите это всё?

Добавлено через 1 минуту
После записи делайте:
C++
1
fflush(fp);
Это чтобы записанное из буфера в файл попало.
1
RimoBlack
6 / 6 / 1
Регистрация: 20.10.2009
Сообщений: 111
21.05.2013, 16:04 17
Цитата Сообщение от alsav22 Посмотреть сообщение
Как видите это всё?

Добавлено через 1 минуту
После записи делайте:
C++
1
fflush(fp);
Это чтобы записанное из буфера в файл попало.
И снова в точку! Я в процессе работы программы следил за выходным файлом, после fwrite там ничего не менялось, менялось только после fclose.
Таким же макаром я с 'cin' бился, пока flush не применил))
0
21.05.2013, 16:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.05.2013, 16:04

Бинарные файлы. Чтение
Дан бинарный файл, компонентами которого являются массивы действительных чисел....

Бинарные чтение/запись объектов
Всем привет. Люди добрые - поможите пожалуйста :) Написал такой код: ...

Бинарные запись и чтение структуры в файл
Записываю структуру в файл.. нужно прочитать.. но он не читает... если delete...


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

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

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