Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.66/35: Рейтинг темы: голосов - 35, средняя оценка - 4.66
6 / 6 / 2
Регистрация: 04.10.2011
Сообщений: 115

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

18.05.2013, 22:27. Показов 7332. Ответов 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
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.05.2013, 22:27
Ответы с готовыми решениями:

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

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

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

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

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

Спасибо так и реализовал, вывод не пускайте джавистов к с++ разработке)
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
19.05.2013, 14:33
Но тут не всё так просто. Нужно предусмотреть освобождение памяти под указателем в деструкторе, и сделать явные конструкторы копирования и присваивания (для глубокого копирования/присваивания). Иначе будут проблемы.
0
7 / 7 / 1
Регистрация: 20.10.2009
Сообщений: 112
21.05.2013, 15:21
А подскажите ещё такой момент, как правильно сделать поиск-замену по файлу.
Есть у меня некая структура, я по циклу перебираю записи в файле, нахожу необходимую, меняю значения переменных в структуре и записываю на то-же место в файле, но происходит что-то не то.

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

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

Добавлено через 1 минуту
После записи делайте:
C++
1
fflush(fp);
Это чтобы записанное из буфера в файл попало.
И снова в точку! Я в процессе работы программы следил за выходным файлом, после fwrite там ничего не менялось, менялось только после fclose.
Таким же макаром я с 'cin' бился, пока flush не применил))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.05.2013, 16:04
Помогаю со студенческими работами здесь

Функции fread() и fwrite()
Меня интересует что это за "счётчик" в этих функциях fwrite( massiv, *size_int * sizeof(unsigned int), 1, fp); <= в большинстве...

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru