Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > бин файлы


Автор: afanp 10.6.2009, 18:16
При добавлении данных в бинарный файл из обычного текстового происходит ошибка
Код


void StringParse(string s1){
    ofstream out;
    size_t found;
    string Side; //здесь мы парсим строку и забиваем все в RichBichP
    double rate;
    CRB_Bank RichBichP;
    unsigned int NumberOfPos=0;
    found=s1.find_first_of(" ");
    while(found!=string::npos){
        Side.assign(s1.substr(0,found));
        s1.erase(0,found+1);
        found=s1.find_first_of(" ");
        switch(NumberOfPos){
            case 0:{
    //            cout << Side << endl; //выбиваем дату
                RichBichP.date=Side;
                break;
                   }
            case 1:{
                char*c=new char[Side.size()];
                strcpy(c,Side.c_str());// выбиваем доллары
                rate=atof(c);
    //            cout << rate << endl;
                RichBichP.dollar=rate;
                break;
                   }
            case 2:{
                char*c=new char[Side.size()]; // выбиваем евро 
                strcpy(c,Side.c_str());
                rate=atof(c);
    //            cout << rate << endl;
                RichBichP.euro=rate;
                break;
                   }
        }
        NumberOfPos++;
    }
    char*c=new char[Side.size()]; // выбиваем фунты
    strcpy(c,s1.c_str());
    rate=atof(c);
    //cout << rate << endl;
    RichBichP.pound=rate;
    out.open("bin.txt",ios::app,ios::binary);
    out.write((char*)&RichBichP,sizeof(RichBichP));
    out.close();
}

void Import_From_Txt(){ // импортируем из текстового файла в бинарный 
    ifstream in; //открываем файл 
    in.open("importfromtxt.txt");
    if(!in){
        cout << "file cannot be opened or doesn't exist\n";
    }
    else{
        string side;
        while(!in.eof()){
            getline(in,side);
            StringParse(side);
        }
    }
}

void ShowRecords(){
    ifstream in;
    in.open("bin.txt",ios::binary);
    in.seekg(0);
    while(!in.eof()){
        CRB_Bank data;
        in.read((char*)&data,sizeof(data));  //приводим к типу чар и записываем все в data 
        if(!in.eof()){
            cout << data.date << " " << data.dollar << " " << data.euro;
            cout << " " << data.pound << endl;
        }
    }
}


Добавлено через 11 минут и 4 секунды
так, кажется разобрался. Косяк происходит из-за того, что в бин файле хранятся doubl'e значения. Кто поможет разобраться?

Автор: andrew_121 10.6.2009, 18:52
afanp, Для начала объясни, что твоя программа должна делать?

Автор: azesmcar 10.6.2009, 19:51
afanp

Ох какая программа нехорошая...
Цитата

char*c=new char[Side.size()];

выделение памяти, нигде не удаляется, указатель теряется..да еще и в цикле smile

Добавлено через 1 минуту и 54 секунды
Цитата(afanp @  10.6.2009,  18:16 Найти цитируемый пост)
Косяк происходит

Обкуренная программа smile побольше информации

Автор: afanp 10.6.2009, 21:01
Предметная область «Курсы валют». Программа работает с бинарным файлом, содержащим 
записи об изменении курсов валют. Каждая запись включает дату и значения курсов трех валют по ЦБ в рублях на 
эту дату. Валюты доллар евро и фунт стерлингов.
Предусмотреть:
•    Добавление новой записи в файл.
•    Импорт записей из текстового файла.
•    Отображение всех валютных рекордов (когда хотя бы одна из валют принимает максимальное значение).
•    Отображение всех записей на экране, отсортированных по дате.
Когда я добавляю несколько записей из текстового файла в бинарный, программа вылетает. А почему - понять не могу :(  
Записи вида -  12.03.2200 22.30 31.30 49.30

Добавлено через 4 минуты и 9 секунд
azesmcar, 
когда пытаюсь удалить char*c=new char[Side.size()]; вылетает ошибка. Вот такие дела

Добавлено через 8 минут и 29 секунд
Но, когда запиысываю в файл 1 элемент, без дозаписи, т.е без ios::app то все работает. Но если более одного файла, то нифига  smile 

Автор: andrew_121 10.6.2009, 21:28
afanp, Т.е. Функция void StringParse(string s1) парсит строку вида 12.03.2200 22.30 31.30 49.30 ?
Тогда куда помещается результат парса?

Автор: afanp 10.6.2009, 21:29
andrew_121, 
в элемент  CRB_Bank RichBichP;
который потом записывается в б-файл

Автор: andrew_121 10.6.2009, 21:31
Я думаю, тебе нужно определить структуру типа:
Код

struct Kurs {
   std::string date;
   std::string dollar;
   std::string euro;
   std::string funt;
};

Тогда будет проще манипулировать. А функция парсинга, будет парсить строку, и результат возвращать в виде стркутуры.

Автор: azesmcar 10.6.2009, 21:38
Цитата(afanp @  10.6.2009,  21:01 Найти цитируемый пост)
когда пытаюсь удалить char*c=new char[Side.size()]; вылетает ошибка. Вот такие дела

A, ну тогда конечно удалять не стоит. Подумаешь, память. Не терять же время на то чтобы проверить почему программа вылетает при удалении.
Кстати то что программа вылетает - скорее всего признак того что вы там что-то затираете, выходите за рамки своего массива. Короче на протяжении всего своего существования программа медленными (медленными потому что все это быстро работать никак не может), но твердыми шагами идет к тому чтобы благополучно умереть. Можно узнать что конкретно нужно сделать и что не работает. И еще по возможности локализировать проблему и показать проблемный участок. А то весь код как-то неохота читать

Автор: andrew_121 10.6.2009, 21:39
Цитата(afanp @  10.6.2009,  21:29 Найти цитируемый пост)
в элемент  CRB_Bank RichBichP;
который потом записывается в б-файл 

ну приведи его описание что-ли. или я должен догадаться?

Добавлено через 1 минуту и 37 секунд
Цитата(azesmcar @  10.6.2009,  21:38 Найти цитируемый пост)
A, ну тогда конечно удалять не стоит. Подумаешь, память. Не терять же время на то чтобы проверить почему программа вылетает при удалении.

жаль нет таких смайликов, которые могли бы передать мое мнение по этому поводу(

Добавлено через 2 минуты и 27 секунд
Цитата(azesmcar @  10.6.2009,  21:38 Найти цитируемый пост)
медленными потому что все это быстро работать никак не может

 smile  smile  smile  smile  smile  smile  smile  smile  smile 

Автор: xvr 11.6.2009, 11:39
Еще баг в копилку: вот это out.open("bin.txt",ios::app,ios::binary); должно быть таким out.open("bin.txt",ios::app|ios::binary);

Автор: andrew_121 11.6.2009, 11:40
Цитата(xvr @  11.6.2009,  11:39 Найти цитируемый пост)
Еще баг в копилку: вот это out.open("bin.txt",ios::app,ios::binary); должно быть таким out.open("bin.txt",ios::app|ios::binary);

ГЫ smile  Проглядели smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)