6 / 6 / 2
Регистрация: 04.10.2011
Сообщений: 115
1

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

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

Author24 — интернет-сервис помощи студентам
Добрый день. Пытаюсь разобратся с чтением и записью в бинарные файлы.. в общем обрисую в краце проблему, записываю класс.
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.05.2013, 22:27
Ответы с готовыми решениями:

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

Запись / чтение из файла через fwrite/fread
Итак здравствуйте) объясниет пожалуйста что за баг))) простенькая вроде программа. записываем...

Кроме .txt файла, еще какие файлы можна использовать в операторах php (fopen,fread,fwrite)?
Можем ли работать с файлами, .doc, .xls, .html, .db и.т.д

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

16
Псевдослучайный
1946 / 1145 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
18.05.2013, 22:53 2
Размер указателя может отличаться от размера типа, там мог бы быть sizeof(float*).
Однако, запись указателя в файл — вообще малополезное занятие, актуальными значения будут только в пределах одного запуска программы.
0
6 / 6 / 2
Регистрация: 04.10.2011
Сообщений: 115
18.05.2013, 23:48  [ТС] 3
Запись и чтение просиходит на РАЗНЫХ комьютерах. А как запись значения из указателя.
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
19.05.2013, 00:22 4
C++
1
fwrite(mDescriptor,sizeof(float),1,f);
0
6 / 6 / 2
Регистрация: 04.10.2011
Сообщений: 115
19.05.2013, 13:12  [ТС] 5
Пробывал не работает
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
19.05.2013, 13:41 6
Цитата Сообщение от Gerbasha Посмотреть сообщение
Пробывал не работает
Я думаю, проблема в том, что под указателем нет памяти и он ни на что не указывает, поэтому в файл пишите мусор. Он у вас на что должен указывать?
1
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
5498 / 4893 / 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
6 / 6 / 2
Регистрация: 04.10.2011
Сообщений: 115
19.05.2013, 14:30  [ТС] 9
Добавлено через 3 минуты
Это код только для проверки (как приблизительно должно выглядеть):

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

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

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

Fread,fopen,fwrite
Добрый день, пытаюсь считать бинарно данные из файла с помощью fread, а далее записать в другой...

Fread() & fwrite()
Помогите пожалуйста ,не могу понять как использовать функции fread() и fwrite(). И если можно...

Fread/fwrite size vs count
Есть ли практическая разница между указанием полного размера только в size или же в size*count,...

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru