Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.06.2015, 20:04   #1
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию С++, бинарный файл, программа не компилируется

При добавлении в конец файла использовал ios::app.

проблема в строке
Код:
 file_add.write(&l,sizeof(int));
 file_add.write((char*)&tovari.names.c_str(),sizeof(l));
Как сделать так,чтоб в бинарный файл записался преобразованный тип string?

Пробовал без sizeOf

Ошибка :

"lvalue required as unary '&' operand
file_add.write((char*)&tovari.names .c_str(),sizeof(l));
^"


вот полный код программы

Код:
#include <QCoreApplication>
#include <iostream>
#include <fstream>

using namespace std;

struct svodka
{
    string names;
    float price;
    int kolich;

};


int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);


    int menu=0;

    svodka tovari;

    do
    {system("cls"); //чистка консоли
        cout<<"1 - add new struct;\n2 - View file+obsh_stoim;\n0-exit;\n";
        cin>>menu;
        cin.ignore(); //убираем след от нажатия Enter (!!!)

        if (menu==1)
        {system("cls");

            ofstream file_add;
            file_add.open("d://Tovari.dat",ios::app|ios::binary);

            int add=1,count=0;


            do
            {cout<<"Input names: ";

                getline(cin,tovari.names,'\n');
                int l=tovari.names.length();     
                file_add.write(&l,sizeof(int));
                file_add.write((char*)&tovari.names.c_str(),sizeof(l));


                cout<<"Input price: ";
                cin>>tovari.price;
                file_add.write((char*)&tovari.price,sizeof(tovari.price));



                cout<<"Input kolichestvo: ";
                cin>>tovari.kolich;
                file_add.write((char*)&tovari.kolich,sizeof(tovari.kolich));

                count++;


                cout<<"Add new? 0-No...."<<endl;
                cin>>add;

            }
            while (add!=0);


           cout<<"Dobavleno: "<<count<<" struct...Input cifra and Press ENTER"<<endl;
            cin>>add;
            cin.ignore();

            file_add.close();
        }

        if (menu==2)
        {system("cls");

        }





    }
    while (menu!=0);

    system("cls");
    cout<<"POKA!";



    return a.exec();
}
from dark to light)

Последний раз редактировалось Алексей_2012; 10.06.2015 в 20:12.
Алексей_2012 вне форума Ответить с цитированием
Старый 10.06.2015, 20:33   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,726
По умолчанию

c_str итак возвращает указатель, зачем еще раз брать адрес?
p51x вне форума Ответить с цитированием
Старый 10.06.2015, 20:42   #3
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

Решил проблему, используя структуру типа char, а не string.

ВОт код, все работает, НО(!) почему-то при чтении из файла дублируется последняя запись.

т.е. я добавляю только 2 записи, а выводится три, в чем может быть проблема?
Смотрите на код, где menu==2


наименование1
цена1
количество1

наименование2
цена2
количество2

наименование2 (!)
цена2 (!)
количество2 (!)

Код:
system("cls");
            int ok=0;

            ifstream fin("d://Tovari.dat",ios::in|ios::binary);

            if (fin.is_open())
            {

                float obsh=0;

                while(!fin.eof())
                {
                    fin.read((char*)&tovari,sizeof(tovari));

                    float one_obsh=tovari.kolich*tovari.price;


                    cout<<"Names: "<<tovari.names<<"\nPrice za 1: "<<tovari.price
                       <<"\nKolich: "<<tovari.kolich<<"\nItogo obsh: "<<one_obsh
                      <<"\n-----------------------------"<<endl;

                    obsh+=one_obsh;
                    ok++;
                }




                cout<<"\n\nPokazano: "<<ok<<"\nVsego price: "<<obsh;
            }
            else

                cout<<"File is not search! Enter cifra...";
            cin>>ok;
            fin.close();
вот весь код

Код:
#include <QCoreApplication>
#include <iostream>
#include <fstream>

using namespace std;

struct svodka
{
    char names[50];
    float price;
    int kolich;

};


int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);


    int menu=0;

    svodka tovari;

    do
    {system("cls"); //чистка консоли
        cout<<"1 - add new struct;\n2 - View file+obsh_stoim;\n0-exit;\n";
        cin>>menu;
        cin.ignore(); //убираем след от нажатия Enter (!!!)

        if (menu==1)
        {system("cls");

            ofstream file_add("d://Tovari.dat",ios::app|ios::binary);

            int add=1,count=0;


            do
            {
                cout<<"Input names: ";
                cin.getline(tovari.names,50);
                cout<<"Input price: ";
                cin>>tovari.price;
                cout<<"Input kolichestvo: ";
                cin>>tovari.kolich;

                file_add.write((char*)&tovari,sizeof(tovari));

                count++;


                cout<<"Add new? 0-No....";
                cin>>add;
                cout<<endl;
                cin.ignore();

            }
            while (add!=0);


            cout<<"Dobavleno: "<<count<<" struct...\nInput cifra and Press ENTER"<<endl;
            cin>>add;
            cin.ignore();

            file_add.close();
        }

        if (menu==2)
        {system("cls");
            int ok=0;

            ifstream fin("d://Tovari.dat",ios::in|ios::binary);

            if (fin.is_open())
            {

                float obsh=0;

                while(!fin.eof())
                {
                    fin.read((char*)&tovari,sizeof(tovari));

                    float one_obsh=tovari.kolich*tovari.price;


                    cout<<"Names: "<<tovari.names<<"\nPrice za 1: "<<tovari.price
                       <<"\nKolich: "<<tovari.kolich<<"\nItogo obsh: "<<one_obsh
                      <<"\n-----------------------------"<<endl;

                    obsh+=one_obsh;
                    ok++;
                }




                cout<<"\n\nPokazano: "<<ok<<"\nVsego price: "<<obsh;
            }
            else

                cout<<"File is not search! Enter cifra...";
            cin>>ok;
            fin.close();

        }





    }
    while (menu!=0);

    system("cls");
    cout<<"POKA!";




    return a.exec();
}
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 10.06.2015, 20:52   #4
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

Цитата:
c_str итак возвращает указатель, зачем еще раз брать адрес?
Код:
             file_add.write((int* )l,l);
              file_add.write((char*)tovari.names.c_str(),sizeof(l));
ругается на первую строку
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 11.06.2015, 04:35   #5
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,726
По умолчанию

Эээ... а как c_str мог на нее повлиять? Там правильно надо брать адрес, а если файл текстовой, а не бинарный, то еще и инт преобразовывать типа itoa.
p51x вне форума Ответить с цитированием
Старый 11.06.2015, 10:44   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
QCoreApplication a(argc, argv)
Не понимаю... Кутья... file_add.write...
Что это за поп, играющий на балалайке в тазике? Неужели у QT нет классов, которые бы более удобными оказались для таких вещей?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.06.2015, 10:54   #7
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,726
По умолчанию

Таки вы не поверите, но http://doc.qt.io/qt-5/qfile.html
p51x вне форума Ответить с цитированием
Старый 11.06.2015, 11:28   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А QTextStream навесить? Не?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.06.2015, 13:10   #9
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,726
По умолчанию

Ну это же читать доки надоть...
p51x вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Бинарный файл. ekaterina1993 Помощь студентам 3 18.01.2015 16:42
C++, задача на бинарный файл (Бинарный файл состоит из записей по 5 бит) zaitsevmishka Помощь студентам 3 16.05.2014 21:39
Бинарный файл Хитман Помощь студентам 1 27.03.2011 19:04
Бинарный файл mchip Microsoft Office Excel 10 05.03.2009 19:10
Бинарный файл Bayazet Общие вопросы Delphi 1 04.03.2009 16:39