Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
DimaAvatar
0 / 0 / 1
Регистрация: 05.02.2014
Сообщений: 141
#1

Чтение файла в бинарном формате

12.06.2016, 23:32. Просмотров 844. Ответов 7
Метки нет (Все метки)

Доброго времени суток.
Я делаю учебную программу. Теоретически в текстовый файл я буду записывать объекты класса. А вот для работы с этими данными мне необходимо будет считать данные, и.. эм, зарезервировать память под эти объекты, только я ни как не возьму в толк... как я буду считать кол-во объектов? Когда я открывал файл в текстовом формате то у меня каждая строка был объект - кол-во строк - это было кол-во объектов которые у меня в итоге получались... а когда я читаю в бинарном формате?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int count_memmory(){
    ifstream file;
    int count = -1;
    string just_for_count;
    file.open("/home/dima/QT_CPP/my_project/sklad/goods.txt", ios::binary|ios::in);//здесь указать свой путь к файлу
    if (!file.is_open()){
        cout<<"<База данных не обнаружена проверьте верность указания пути\n";
    } else {
        while (!file.eof()){
            file.read() // вот тут что то надо , а что именно надо ни как не пойму
            count++;
        }
    }
    file.close();
    file.clear();
    return count;
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.06.2016, 23:32
Ответы с готовыми решениями:

Как задать переменную в бинарном формате? (В шестнадцатиричном через Х, а бинарном?)
То есть какой синтаксис ваще? для 16-иричной НОЛЬ икс ЧИСЛО, к примеру, могу...

Чтение из файла в формате Unicode
Прошу помощи, пытаюсь считать информацию из файла который в кодировке Unicode ...

Чтение файла в Unicode формате
Как можно за одно обращение к потоку забрать не один байт, а сразу два?...

Как сохранить древовидную структуру в бинарном формате?
Собственно, вопрос. Есть данные, следующего вида: nodes 0 &quot;root&quot; -1 1...

Записать данные решения системы уравнения в текстовом и бинарном формате
Всем привет! Задача: Решить систему уравнений. Записать полученные данные в...

7
Renji
2102 / 1543 / 470
Регистрация: 05.06.2014
Сообщений: 4,472
12.06.2016, 23:51 #2
Да как всегда: проверяя прочиталось или на EOF налетели.
C++
1
2
while(stream.read((char*)&temp,sizeof(temp)))
    list.push_back(temp);
1
DimaAvatar
0 / 0 / 1
Регистрация: 05.02.2014
Сообщений: 141
12.06.2016, 23:55  [ТС] #3
Renji, Спасибо, сейчас буду разбираться, хм, эм, но Вы, я так понимаю кидаете объекты в список, моя же задача была подсчитать кол-во памяти - выделить ее, а потом уже повторным чтением произвести инициализацию элементов массива
0
Renji
2102 / 1543 / 470
Регистрация: 05.06.2014
Сообщений: 4,472
12.06.2016, 23:59 #4
Лучший ответ Сообщение было отмечено DimaAvatar как решение

Решение

Цитата Сообщение от DimaAvatar Посмотреть сообщение
моя же задача была подсчитать кол-во памяти
C++
1
2
3
stream.seekg(0,std::ios_base::end);
size_t size=stream.tellg();//количество памяти
stream.seekg(0,std::ios_base::beg);
1
DimaAvatar
0 / 0 / 1
Регистрация: 05.02.2014
Сообщений: 141
16.06.2016, 21:00  [ТС] #5
не все так просто оказалось... сейчас попробую описать
0
Hikari
Хитрая блондиночка $)
1451 / 963 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
16.06.2016, 21:04 #6
Цитата Сообщение от DimaAvatar Посмотреть сообщение
моя же задача была подсчитать кол-во памяти - выделить ее, а потом уже повторным чтением произвести инициализацию элементов массива
Это принципиально? Чем составления списка не устроило?
0
DimaAvatar
0 / 0 / 1
Регистрация: 05.02.2014
Сообщений: 141
16.06.2016, 21:07  [ТС] #7
в какой то момент я решил переписать программу и задался вопросом, можно ли создавать объект класса в методах класса?

wire.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#ifndef WIRE_H
#define WIRE_H
#include "goods.h"
 
using namespace std;
 
 
class wire:public virtual goods {
    protected:
        string product;
        string brand;
        string model;
        float amount;
 
    public:
     wire(){};
     void compare();
     void show(){};
     void set(string&,string&,string&,string&);
     void new_write();
};
#endif // WIRE_H
wire.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
43
44
45
46
47
48
49
50
51
52
53
54
#include "wire.h"   // подключаем заголовочный файл
#include <cstring>  // для операций над string
#include <fstream>  // для открытия и чтнния файла
#include <iomanip>  // std::setw для форматированного вывод
#include <cstdlib>
#include <iostream>
 
using namespace std;
/*здесь метод set принимает аргументы из main */
void wire::set(string& prod,string& br,string& mod,string& am){
    product  = prod;
    brand = br;
    model = mod;
    amount = atof(am.c_str());
    compare();
}
 
void wire::compare(){
    int count = 0;//count для проверки файла на отсутствие объектов
    wire temp; // создаю объект класса
    fstream file;
    file.open("/home/dima/QT_CPP/my_project/binary/goods.txt", ios::out | ios::binary);
    if (!file.is_open()){
        cout<<"<База данных не обноруженна проверьте верность указания пути\n";
    } else {
        /*вот эта строчка из за которой я вынужден создавать объект класса в классе*/
        while(file.read((char*)&temp,sizeof(temp))){
            ++count;
        }
    }
    file.close();
    file.clear();//без сброса флагов ошибок работать не будет
 
    if (count == 0 ) new_write();
 
}
 
void wire::new_write(){
    wire temp;
    temp.product = product;
    temp.brand = brand;
    temp.model = model;
    temp.amount = amount;
 
    fstream file;
    file.open("/home/dima/QT_CPP/my_project/binary/goods.txt", ios::out | ios::app | ios::binary);
    if (!file.is_open()){
        cout<<"<База данных не обноруженна проверьте верность указания пути\n";
    } else {
        file.write((char*)&temp,sizeof(temp));
    }
    file.close();
    file.clear();//без сброса флагов ошибок работать не будет
}
ну и понятное дело ни чего не получается.
Bash
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
60
Анализ памяти /home/dima/QT_CPP/my_project/build-binary-Desktop_Qt_5_6_0_GCC_64bit-Debug/binary
==5640== Memcheck, a memory error detector
==5640== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==5640== Using Valgrind-3.10.1 and LibVEX; rerun with -h for copyright info
==5640== Command: /home/dima/QT_CPP/my_project/build-binary-Desktop_Qt_5_6_0_GCC_64bit-Debug/binary
==5640== 
==5640== (action at startup) vgdb me ... 
==5640== 
==5640== TO DEBUG THIS PROCESS USING GDB: start GDB like this
==5640==   /path/to/gdb /home/dima/QT_CPP/my_project/build-binary-Desktop_Qt_5_6_0_GCC_64bit-Debug/binary
==5640== and then give GDB the following command
==5640==   target remote | /usr/lib/valgrind/../../bin/vgdb --pid=5640
==5640== --pid is optional if only one valgrind process is running
==5640== 
Анализ завершён.
**  **
 
Анализ памяти /home/dima/QT_CPP/my_project/build-binary-Desktop_Qt_5_6_0_GCC_64bit-Debug/binary
==5664== Memcheck, a memory error detector
==5664== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==5664== Using Valgrind-3.10.1 and LibVEX; rerun with -h for copyright info
==5664== Command: /home/dima/QT_CPP/my_project/build-binary-Desktop_Qt_5_6_0_GCC_64bit-Debug/binary
==5664== 
==5664== (action at startup) vgdb me ... 
==5664== 
==5664== TO DEBUG THIS PROCESS USING GDB: start GDB like this
==5664==   /path/to/gdb /home/dima/QT_CPP/my_project/build-binary-Desktop_Qt_5_6_0_GCC_64bit-Debug/binary
==5664== and then give GDB the following command
==5664==   target remote | /usr/lib/valgrind/../../bin/vgdb --pid=5664
==5664== --pid is optional if only one valgrind process is running
==5664== 
==5664== Syscall param write(buf) points to uninitialised byte(s)
==5664==    at 0x543C710: __write_nocancel (syscall-template.S:81)
==5664==    by 0x4EB28D5: ??? (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==5664==    by 0x4EEAA77: std::basic_filebuf<char, std::char_traits<char> >::_M_convert_to_external(char*, long) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==5664==    by 0x4EEB4D2: std::basic_filebuf<char, std::char_traits<char> >::overflow(int) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==5664==    by 0x4EEACA2: std::basic_filebuf<char, std::char_traits<char> >::_M_terminate_output() (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==5664==    by 0x4EEAD4A: std::basic_filebuf<char, std::char_traits<char> >::close() (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==5664==    by 0x4EED52C: std::basic_fstream<char, std::char_traits<char> >::close() (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==5664==    by 0x401CEE: wire::new_write() (wire.cpp:52)
==5664==    by 0x401B39: wire::compare() (wire.cpp:34)
==5664==    by 0x401A05: wire::set(std::string&, std::string&, std::string&, std::string&) (wire.cpp:15)
==5664==    by 0x402244: to_stock(goods**, std::string*) (main_a.cpp:49)
==5664==    by 0x401F72: choise_menu(goods**, std::string*) (main_a.cpp:17)
==5664==    by 0x40163C: main (main.cpp:32)
==5664==  Address 0x5a20264 is 36 bytes inside a block of size 8,192 alloc'd
==5664==    at 0x4C2B800: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==5664==    by 0x4EEA8AB: std::basic_filebuf<char, std::char_traits<char> >::_M_allocate_internal_buffer() (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==5664==    by 0x4EEAEC1: std::basic_filebuf<char, std::char_traits<char> >::open(char const*, std::_Ios_Openmode) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==5664==    by 0x4EED49C: std::basic_fstream<char, std::char_traits<char> >::open(char const*, std::_Ios_Openmode) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==5664==    by 0x401C8F: wire::new_write() (wire.cpp:46)
==5664==    by 0x401B39: wire::compare() (wire.cpp:34)
==5664==    by 0x401A05: wire::set(std::string&, std::string&, std::string&, std::string&) (wire.cpp:15)
==5664==    by 0x402244: to_stock(goods**, std::string*) (main_a.cpp:49)
==5664==    by 0x401F72: choise_menu(goods**, std::string*) (main_a.cpp:17)
==5664==    by 0x40163C: main (main.cpp:32)
==5664==  Uninitialised value was created by a stack allocation
==5664==    at 0x401BAF: wire::new_write() (wire.cpp:38)
==5664== 
==5664== (action on error) vgdb me ...
это valgrind ругается ((

Добавлено через 1 минуту
Hikari, список... да! преподаватель то же так сказал - Дима, у тебя тут напрашивается список, но т.к. курсовую я уже сдал и это что то вроде моей доп работы я решил сначала поиграться с динамической памятью, так что тут у меня самодеятельность прет.
Кстати, именно Ваш совет по работу с бинарными файлами лишил меня покоя )))
п.с. список я ... только не кидайтесь какашками... реализую в версии 3.0.1 своей гениальной работы )))
ну, мб мне так проще - исследовать c++ на одной задаче - подключая сюда все новые и новые моменты. проще потому что не приходиться тратить время на придумывание задач для себя, а перепечатывать примеры из книг.. дело нужное, но все таки предпочитаю использовать их скорее как примеры для реализации свое задумки
0
Hikari
Хитрая блондиночка $)
1451 / 963 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
17.06.2016, 07:43 #8
Цитата Сообщение от DimaAvatar Посмотреть сообщение
список... да!
Тогда стоит поглубже поизучать вот этот класс: http://www.cplusplus.com/reference/list/list/
Цитата Сообщение от DimaAvatar Посмотреть сообщение
именно Ваш совет по работу с бинарными файлами лишил меня покоя )
Ну что ж поделать? Ведьма я, эх ведьма я
0
17.06.2016, 07:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.06.2016, 07:43

Чтение строки в бинарном режиме
Необходимо прочитать файл .txt в бинарном режиме и записать в строку. ...

Запись и чтение двух стеков в бинарном файле C++
Здравствуйте. Необходимо прочитать из текстового файла информацию в два...

При чтении dll библиотеки в обычном(не бинарном) виде, чтение прерывается на NULL
Задача такая: открыть dll файл(не мой) в обычном текстовом виде(каким его могут...


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

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

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