Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> неожиданное поведение fstream 
V
    Опции темы
fprg
Дата 12.8.2010, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 10.8.2010

Репутация: нет
Всего: нет



Код работает правильно только с комментрированием. Если расскоментировать, то первая запись портится. 
Может быть подскажет что нужно делать.

Код

#include "stdafx.h"
#include <fstream>
#include <iostream>
#include <Windows.h>
#include <stdio.h>

#define NTBK_BLK 74
#define SNF_BLK 8

using namespace std;

struct size_inf
{
    int npos;
    int size;
};

struct NOTEBOOK
{
    char model[21];                    // наименование, пробелы допускаются
    unsigned short price;            // цена 
    unsigned short weight;            // масса в граммах
    unsigned short size_x;            // длина в мм
    unsigned short size_y;            // ширина в мм
    unsigned short size_z;            // высота в мм
    unsigned short diagonal;        // размер диагонали в миллиметрах
    unsigned short refresh_rate;    // частота регенерации дисплея
    unsigned short rsltn_width;        // разрешающая способность по длине в пикселах =====
    unsigned short rsltn_height;    // разрешающая способность по ширине в пикселах
    unsigned __int64 cpu_frequency;    // частота CPU в герцах
    unsigned __int64 ram_capacity;    // объем памяти RAM в байтах    
    unsigned __int64 vga_capacity;    // обьем видеопамяти в байтах    
    unsigned __int64 hdd_capacity;    // объем HDD в байтах
};

char* Save(const NOTEBOOK& ntbk)
{
    char *buf = new char[NTBK_BLK];
    for(int i = 0; i < 21; ++i)
        buf[i] = ntbk.model[i];

    *(unsigned short int*)(&buf[22]) = ntbk.price;
    *(unsigned short int*)(&buf[24]) = ntbk.weight;
    *(unsigned short int*)(&buf[26]) = ntbk.size_x;
    *(unsigned short int*)(&buf[28]) = ntbk.size_y;
    *(unsigned short int*)(&buf[30]) = ntbk.size_z;
    *(unsigned short int*)(&buf[32]) = ntbk.diagonal;
    *(unsigned short int*)(&buf[34]) = ntbk.refresh_rate;
    *(unsigned short int*)(&buf[36]) = ntbk.rsltn_width;
    *(unsigned short int*)(&buf[38]) = ntbk.rsltn_height;
    *(unsigned __int64*)(&buf[40]) = ntbk.cpu_frequency;
    *(unsigned __int64*)(&buf[48]) = ntbk.ram_capacity;
    *(unsigned __int64*)(&buf[56]) = ntbk.vga_capacity;
    *(unsigned __int64*)(&buf[64]) = ntbk.hdd_capacity;
    
    return buf;
}

void Load(const char *buf, NOTEBOOK& ntbk)
{
    for(int i = 0; i < 21; ++i)
        ntbk.model[i] = buf[i];
    
    ntbk.price = *(unsigned short int*)(&buf[22]);
    ntbk.weight = *(unsigned short int*)(&buf[24]);
    ntbk.size_x = *(unsigned short int*)(&buf[26]);
    ntbk.size_y = *(unsigned short int*)(&buf[28]);
    ntbk.size_z = *(unsigned short int*)(&buf[30]);
    ntbk.diagonal = *(unsigned short int*)(&buf[32]);
    ntbk.refresh_rate = *(unsigned short int*)(&buf[34]);
    ntbk.rsltn_width = *(unsigned short int*)(&buf[36]);
    ntbk.rsltn_height = *(unsigned short int*)(&buf[38]);
    ntbk.cpu_frequency = *(unsigned __int64*)(&buf[40]);
    ntbk.ram_capacity = *(unsigned __int64*)(&buf[48]);
    ntbk.vga_capacity = *(unsigned __int64*)(&buf[56]);
    ntbk.hdd_capacity = *(unsigned __int64*)(&buf[64]);
}

void GetFromFile(const char *pch, NOTEBOOK& ntbk, const unsigned int npos, bool& bErr)
{
    size_inf sinf;
    fstream File;
    File.open(pch, ios::in);
    if(File.is_open()){
        File.read((char *)(&sinf), SNF_BLK);
        if(sinf.npos < npos){
            cerr << "Ошибка! Записи с позицией " << npos << " не существует!" << endl;
            bErr = true;
            return;
        }

        char *buf = new char[NTBK_BLK];
        File.close();
        File.open(pch, ios::in | ios::out);
        File.seekp(SNF_BLK + npos * NTBK_BLK, ios::beg);
        File.read((char *)buf, NTBK_BLK);
        Load(buf, ntbk);
        delete[] buf;
        File.close();
        bErr = false;
    }
    else{
        cerr << "Ошибка! Не удалось открыть файл " << pch << "!" << endl;
        bErr = true;
    }
}    

void disp(const NOTEBOOK& ntbk)
{
    cout << "*************************************************" << endl;    
    cout << "ntbk.model: " << ntbk.model << endl;
    cout << "ntbk.price: " << ntbk.price << endl;
    cout << "ntbk.weight: " << ntbk.weight << endl;
    cout << "ntbk.size_x: " << ntbk.size_x << endl;
    cout << "ntbk.size_y: " << ntbk.size_y << endl;
    cout << "ntbk.size_z: " << ntbk.size_z << endl;
    cout << "ntbk.diagonal: " << ntbk.diagonal << endl;
    cout << "ntbk.refresh_rate: " << ntbk.refresh_rate << endl;
    cout << "ntbk.rsltn_width: " << ntbk.rsltn_width << endl;
    cout << "ntbk.rsltn_height: " << ntbk.rsltn_height << endl;
    cout << "ntbk.cpu_frequency: " << ntbk.cpu_frequency << endl;
    cout << "ntbk.ram_capacity: " << ntbk.ram_capacity << endl;
    cout << "ntbk.vga_capacity: " << ntbk.vga_capacity << endl;
    cout << "ntbk.hdd_capacity: " << ntbk.hdd_capacity << endl;
    cout << "*************************************************" << endl;
}


void WriteToFile(const char *pch, const NOTEBOOK& ntbk)
{
    size_inf sinf;
    fstream File;
    File.open(pch, ios::in);
    if(File.is_open()){
        File.read((char *)(&sinf), SNF_BLK);
        File.close();
        File.open(pch, ios::in | ios::out);
        if(!(sinf.npos % 16) && sinf.npos){
            sinf.size += sinf.npos;
            int blks = sinf.npos * NTBK_BLK;
            char *buf = new char[blks];
            File.seekp(0, ios::end);
            File.write((char *)buf, blks);
            delete[] buf;            
        }

        ++sinf.npos;
        File.seekp(0, ios::beg);
        File.write((char *)(&sinf), SNF_BLK);
        char *buf = Save(ntbk);
        File.seekp(SNF_BLK + sinf.npos * NTBK_BLK, ios::beg);
        File.write((char *)buf, NTBK_BLK);
        delete[] buf;
    }
    else{
        File.close();
        File.clear();
        File.open(pch, ios::out);
        sinf.npos = 0;
        sinf.size = 20;
        char *buf = Save(ntbk);
        File.write((char *)(&sinf), SNF_BLK);
        File.write((char *)buf, NTBK_BLK);
        delete[] buf;
        int blks = 19 * NTBK_BLK;
        buf = new char[blks];
        File.write((char *)buf, blks);
        delete[] buf;
    }    
}


int _tmain(int argc, _TCHAR* argv[])
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);

    NOTEBOOK nt1, nt2, nt3, nt4, nt5, nt6, nt7, nt8, nt9, nt10, nt11, nt12, nt13, nt14, nt15, nt16, nt17, nt18;
    string str;
    bool bErr;
    
    ifstream inFile("notebook.dat");
    if(inFile.is_open()){
        inFile.close();
        remove("notebook.dat");
    }

    str = "Acer Note Light";
    strcpy_s(nt1.model, 21, str.c_str());
    nt1.price = 2699;
    nt1.weight = 5600;
    nt1.size_x = 51;
    nt1.size_y = 300;
    nt1.size_z = 211;
    nt1.diagonal = 264;
    nt1.refresh_rate = 60;
    nt1.rsltn_width = 1024;
    nt1.rsltn_height = 768;
    nt1.cpu_frequency = 100000;
    nt1.ram_capacity = 41943040;    
    nt1.vga_capacity = 1048576;    
    nt1.hdd_capacity = 831076172;
    
    str = "ASW ND5123T";
    strcpy_s(nt2.model, 21, str.c_str());
    nt2.price = 3489;
    nt2.weight = 7200;
    nt2.size_x = 58;
    nt2.size_y = 300;
    nt2.size_z = 256;
    nt2.diagonal = 307;
    nt2.refresh_rate = 70;
    nt2.rsltn_width = 1024;
    nt2.rsltn_height = 768;
    nt2.cpu_frequency = 133000;
    nt2.ram_capacity = 33554432;    
    nt2.vga_capacity = 2097152;    
    nt2.hdd_capacity = 1395864371;    

    str = "ARMNote TS80CD";
    strcpy_s(nt3.model, 21, str.c_str());
    nt3.price = 3699;
    nt3.weight = 7200;
    nt3.size_x = 51;
    nt3.size_y = 292;
    nt3.size_z = 223;
    nt3.diagonal = 287;
    nt3.refresh_rate = 75;
    nt3.rsltn_width = 1024;
    nt3.rsltn_height = 768;
    nt3.cpu_frequency = 133000;
    nt3.ram_capacity = 67108864;    
    nt3.vga_capacity = 1048576;    
    nt3.hdd_capacity = 1395864371;

    str = "AST Ascentia P50";
    strcpy_s(nt4.model, 21, str.c_str());
    nt4.price = 4499;
    nt4.weight = 7500;
    nt4.size_x = 58;
    nt4.size_y = 287;
    nt4.size_z = 229;
    nt4.diagonal = 287;
    nt4.refresh_rate = 70;
    nt4.rsltn_width = 800;
    nt4.rsltn_height = 600;
    nt4.cpu_frequency = 133000;
    nt4.ram_capacity = 41943040;    
    nt4.vga_capacity = 1048576;    
    nt4.hdd_capacity = 831076172;

    str = "BSI NP8657D";
    strcpy_s(nt5.model, 21, str.c_str());
    nt5.price = 2605;
    nt5.weight = 8000;
    nt5.size_x = 58;
    nt5.size_y = 300;
    nt5.size_z = 236;
    nt5.diagonal = 287;
    nt5.refresh_rate = 60;
    nt5.rsltn_width = 1024;
    nt5.rsltn_height = 768;
    nt5.cpu_frequency = 133000;
    nt5.ram_capacity = 41943040;    
    nt5.vga_capacity = 1048576;    
    nt5.hdd_capacity = 869730877;

    str = "BSI NP5265A";
    strcpy_s(nt6.model, 21, str.c_str());
    nt6.price = 3765;
    nt6.weight = 8200;
    nt6.size_x = 63;
    nt6.size_y = 305;
    nt6.size_z = 229;
    nt6.diagonal = 307;
    nt6.refresh_rate = 70;
    nt6.rsltn_width = 1024;
    nt6.rsltn_height = 768;
    nt6.cpu_frequency = 150000;
    nt6.ram_capacity = 33554432;    
    nt6.vga_capacity = 2097152;    
    nt6.hdd_capacity = 1395864371;

    str = "Dell Xpi PIOOSD";
    strcpy_s(nt7.model, 21, str.c_str());
    nt7.price = 3459;
    nt7.weight = 6000;
    nt7.size_x = 58;
    nt7.size_y = 279;
    nt7.size_z = 223;
    nt7.diagonal = 262;
    nt7.refresh_rate = 60;
    nt7.rsltn_width = 1024;
    nt7.rsltn_height = 768;
    nt7.cpu_frequency = 100000;
    nt7.ram_capacity = 41943040;    
    nt7.vga_capacity = 1048576;    
    nt7.hdd_capacity = 830002430;

    str = "Digital HiNote";
    strcpy_s(nt8.model, 21, str.c_str());
    nt8.price = 4799;
    nt8.weight = 4000;
    nt8.size_x = 33;
    nt8.size_y = 279;
    nt8.size_z = 223;
    nt8.diagonal = 264;
    nt8.refresh_rate = 56;
    nt8.rsltn_width = 800;
    nt8.rsltn_height = 600;
    nt8.cpu_frequency = 120000;
    nt8.ram_capacity = 41943040;    
    nt8.vga_capacity = 1048576;    
    nt8.hdd_capacity = 1073741824;

    str = "Gateway Solo S5";
    strcpy_s(nt9.model, 21, str.c_str());
    nt9.price = 4499;
    nt9.weight = 5600;
    nt9.size_x = 51;
    nt9.size_y = 302;
    nt9.size_z = 223;
    nt9.diagonal = 287;
    nt9.refresh_rate = 60;
    nt9.rsltn_width = 1024;
    nt9.rsltn_height = 768;
    nt9.cpu_frequency = 133000;
    nt9.ram_capacity = 41943040;    
    nt9.vga_capacity = 2097152;    
    nt9.hdd_capacity = 736586891;

    str = "Hertz Z-Optima NB";
    strcpy_s(nt10.model, 21, str.c_str());
    nt10.price = 3995;
    nt10.weight = 8000;
    nt10.size_x = 58;
    nt10.size_y = 302;
    nt10.size_z = 229;
    nt10.diagonal = 284;
    nt10.refresh_rate = 75;
    nt10.rsltn_width = 1024;
    nt10.rsltn_height = 768;
    nt10.cpu_frequency = 150000;
    nt10.ram_capacity = 41943040;    
    nt10.vga_capacity = 2097152;    
    nt10.hdd_capacity = 1073741824;

    str = "HP Omni Book 5500";
    strcpy_s(nt11.model, 21, str.c_str());
    nt11.price = 6120;
    nt11.weight = 7100;
    nt11.size_x = 51;
    nt11.size_y = 292;
    nt11.size_z = 229;
    nt11.diagonal = 290;
    nt11.refresh_rate = 75;
    nt11.rsltn_width = 1024;
    nt11.rsltn_height = 768;
    nt11.cpu_frequency = 133000;
    nt11.ram_capacity = 67108864;    
    nt11.vga_capacity = 1048576;    
    nt11.hdd_capacity = 1395864371;

    str = "IBM ThinkPad 560";
    strcpy_s(nt12.model, 21, str.c_str());
    nt12.price = 3749;
    nt12.weight = 4100;
    nt12.size_x = 33;
    nt12.size_y = 300;
    nt12.size_z = 223;
    nt12.diagonal = 307;
    nt12.refresh_rate = 85;
    nt12.rsltn_width = 1024;
    nt12.rsltn_height = 768;
    nt12.cpu_frequency = 120000;
    nt12.ram_capacity = 41943040;    
    nt12.vga_capacity = 2097152;    
    nt12.hdd_capacity = 831076172;

    str = "NEC Versa 4080H";
    strcpy_s(nt13.model, 21, str.c_str());
    nt13.price = 4780;
    nt13.weight = 6600;
    nt13.size_x = 57;
    nt13.size_y = 300;
    nt13.size_z = 241;
    nt13.diagonal = 264;
    nt13.refresh_rate = 70;
    nt13.rsltn_width = 800;
    nt13.rsltn_height = 600;
    nt13.cpu_frequency = 120000;
    nt13.ram_capacity = 50331648;    
    nt13.vga_capacity = 1048576;    
    nt13.hdd_capacity = 833223655;

    str = "Polywell Poly 500";
    strcpy_s(nt14.model, 21, str.c_str());
    nt14.price = 3300;
    nt14.weight = 7900;
    nt14.size_x = 58;
    nt14.size_y = 302;
    nt14.size_z = 229;
    nt14.diagonal = 264;
    nt14.refresh_rate = 72;
    nt14.rsltn_width = 1024;
    nt14.rsltn_height = 768;
    nt14.cpu_frequency = 120000;
    nt14.ram_capacity = 41943040;    
    nt14.vga_capacity = 1048576;    
    nt14.hdd_capacity = 1073741824;
    
    str = "Samsung SENS 810";
    strcpy_s(nt15.model, 21, str.c_str());
    nt15.price = 3667;
    nt15.weight = 8700;
    nt15.size_x = 58;
    nt15.size_y = 292;
    nt15.size_z = 241;
    nt15.diagonal = 289;
    nt15.refresh_rate = 75;
    nt15.rsltn_width = 1024;
    nt15.rsltn_height = 768;
    nt15.cpu_frequency = 100000;
    nt15.ram_capacity = 33554432;    
    nt15.vga_capacity = 2097152;    
    nt15.hdd_capacity = 830002430;

    str = "Twinhead Slimnote";
    strcpy_s(nt16.model, 21, str.c_str());
    nt16.price = 2965;
    nt16.weight = 7400;
    nt16.size_x = 51;
    nt16.size_y = 292;
    nt16.size_z = 203;
    nt16.diagonal = 264;
    nt16.refresh_rate = 70;
    nt16.rsltn_width = 1024;
    nt16.rsltn_height = 768;
    nt16.cpu_frequency = 75000;
    nt16.ram_capacity = 67108864;    
    nt16.vga_capacity = 1048576;    
    nt16.hdd_capacity = 828928688;

    WriteToFile("notebook.dat", nt1);
    WriteToFile("notebook.dat", nt2);
    WriteToFile("notebook.dat", nt3);
    WriteToFile("notebook.dat", nt4);
    WriteToFile("notebook.dat", nt5);
    WriteToFile("notebook.dat", nt6);
    WriteToFile("notebook.dat", nt7);
    WriteToFile("notebook.dat", nt8);
    WriteToFile("notebook.dat", nt9);    
    WriteToFile("notebook.dat", nt10);
//    WriteToFile("notebook.dat", nt11);
//    WriteToFile("notebook.dat", nt12);
//    WriteToFile("notebook.dat", nt13);
//    WriteToFile("notebook.dat", nt14);
//    WriteToFile("notebook.dat", nt15);
//    WriteToFile("notebook.dat", nt16);

    cout << "nt1:" << endl;
    disp(nt1);
    int npos = 0;
    GetFromFile("notebook.dat", nt17, npos, bErr);
    cout << "bErr: " << bErr << endl;
    disp(nt17);
    
    return 0;
}



Это сообщение отредактировал(а) fprg - 12.8.2010, 20:36
PM MAIL   Вверх
azesmcar
Дата 12.8.2010, 19:04 (ссылка)   | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



fprg

Может как-то локализируешь проблему, ну или в крайнем случае добавь еще пару гигабайт кода, чтобы желание сюда заглядывать отпало навсегда.
PM   Вверх
fprg
Дата 12.8.2010, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 10.8.2010

Репутация: нет
Всего: нет



Какие гигабайты? Код полностью привел потому что так проще, бери и запускай. Расскоментируй и увидишь что появляется проблема.
Там нету лишнего кода, если не считать 16 записей для тестирования и все очень просто, проще некуда.
PM MAIL   Вверх
fprg
Дата 12.8.2010, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 10.8.2010

Репутация: нет
Всего: нет



Код начал работать нормально и после расскоментирования после добавления ios::binary:
Код

// var14.cpp : Defines the entry point for the console application.
// Функции и файлы
/*
Вариант 14
Для хранения данных о ноутбуках описать структуру вида, описанного в варианте 10. Написать функцию, которая читает данные о ноутбуках из файла note.txt (см. с. 158) 
в структуру приведенного вида. Написать функцию, которая записывает содержимое структуры в конец бинарного файла. Структура бинарного файла: первые два байта — целое
число записей в файле; далее записи в формате структуры NOTEBOOK. Написать программу, в которой на основе разработанных функций осуществляется запись в двоичный файл
данных только о тех ноутбуках, диагональ дисплея которых больше одиннадцати дюймов.
*/

#include "stdafx.h"
#include <fstream>
#include <iostream>
#include <string>
#include <Windows.h>
#include <stdio.h>

#define FNTBK_BLK 50
#define NTBK_BLK 36

using namespace std;

struct FNTBK
{
    char model[21];                      // наименование, пробелы допускаются
    unsigned short int price;          // цена 
    unsigned short int weight;          // масса в граммах
    unsigned short int size_x;          // длина в мм
    unsigned short int size_y;          // ширина в мм
    unsigned short int size_z;          // высота в мм
    unsigned short int diagonal;      // размер диагонали в миллиметрах
    unsigned short int refresh_rate;  // частота регенерации дисплея
    unsigned short int rsltn_width;      // разрешающая способность по длине в пикселах 
    unsigned short int rsltn_height;  // разрешающая способность по ширине в пикселах
    unsigned short int cpu_frequency; // частота CPU в МГц
    unsigned short int ram_capacity;  // объем памяти RAM в Мб    
    unsigned short int vga_capacity;  // обьем видеопамяти в Мб    
    unsigned short int hdd_capacity;  // объем HDD в Мб
};

struct NTBK
{
    char model[21];                 // наименование
    unsigned short int price;     // цена
    unsigned short int weight;     // вес
    unsigned short int size_x;     // длина в мм
    unsigned short int size_y;     // ширина в мм
    unsigned short int size_z;     // высота в мм
    unsigned short int diagonal; // размер диагонали в миллиметрах
};

void GetFromBaseFile(const char *pch, NTBK& ntbk, const unsigned int npos, bool& bErr)
{
    fstream File;
    File.open(pch, ios::in | ios::binary);
    if(File.is_open()){
        unsigned int size;
        File.read((char *)(&size), 4);
        if(npos >= size){
            cerr << "Запись под номером " << npos << " в файле " << pch << " не существует!" << endl;
            bErr = true;
            return;
        }
        else{
            FNTBK fntbk;
            File.seekp(4 + npos * FNTBK_BLK, ios::beg);
            File.read((char *)(&fntbk), FNTBK_BLK);
            strcpy_s(ntbk.model, 21, fntbk.model);
            ntbk.price = fntbk.price;
            ntbk.weight = fntbk.weight;
            ntbk.size_x = fntbk.size_x;
            ntbk.size_y = fntbk.size_y;
            ntbk.size_z = fntbk.size_z;
            ntbk.diagonal = fntbk.diagonal;
            bErr = false;
        }
    }
    else{
        cerr << "Не удалось открыть файл " << pch << "!" << endl;
        bErr = true;
    }    
}

void GetFromFile(const char *pch, NTBK& ntbk, const unsigned int npos, bool& bErr)
{
    fstream File;
    File.open(pch, ios::in | ios::binary);
    if(File.is_open()){
        unsigned int size;
        File.read((char *)(&size), 4);
        if(npos >= size){
            cerr << "Ошибка! Запись под номером " << npos << " в файле " << pch << " не существует!" << endl;
            bErr = true;
            return;
        }
        else{
            File.seekp(4 + npos * NTBK_BLK, ios::beg);
            File.read((char *)(&ntbk), NTBK_BLK);
            bErr = false;
        }
    }
    else{
        cerr << "Ошибка! Не удалось открыть файл " << pch << "!" << endl;
        bErr = true;
    }    
}

void disp(const NTBK& ntbk)
{
    cout << "****************************" << endl;    
    cout << "model: " << ntbk.model << endl;
    cout << "price: " << ntbk.price << endl;
    cout << "weight: " << ntbk.weight << endl;
    cout << "size_x: " << ntbk.size_x << endl;
    cout << "size_y: " << ntbk.size_y << endl;
    cout << "size_z: " << ntbk.size_z << endl;
    cout << "diagonal: " << ntbk.diagonal << endl;
    cout << "****************************" << endl;
}

void WriteToFile(const char *pch, const NTBK& ntbk, const unsigned int npos)
{
    fstream File;
    File.open(pch, ios::in | ios::out | ios::binary);
    if(File.is_open()){
        unsigned int size;
        File.read((char *)(&size), 4);
        if(npos >= size){
            int offset = npos - size;
            size = npos + 1;
            File.seekp(0, ios::beg);
            File.write((char *)(&size), 4);
            if(offset){
                int blks = offset * NTBK_BLK;
                char *buf = new char[blks];
                File.seekp(0, ios::end);
                File.write((char *)buf, blks);
                delete[] buf;
            }

            File.seekp(0, ios::end);
            File.write((char *)(&ntbk), NTBK_BLK);
        }
        else{
            File.seekp(0, ios::end);
            File.write((char *)(&ntbk), NTBK_BLK);
        }        
    }
    else{
        File.close();
        File.clear();
        File.open(pch, ios::out | ios::binary);
        unsigned int size = npos + 1;
        File.write((char *)(&size), 4);
        if(npos){
            int blks = npos * NTBK_BLK;
            char *buf = new char[blks];
            File.seekp(0, ios::end);
            File.write((char *)buf, blks);
            delete[] buf;
        }

        File.seekp(0, ios::end);
        File.write((char *)(&ntbk), NTBK_BLK);
    }    
}

void GetFromConsole(NTBK& ntbk, unsigned int& npos, bool& bErr)
{
    cout << "Введите значение позиции (unsigned int): ";
    cin >> npos;
    if(cin.fail()){
        cerr << "Ошибка! Ввод значение позиции завершился неудачно! Операция ввода отменена!" << endl;
        bErr = true;
        return;
    }

    cout << "Введите название модели (char[21]): ";
    cin.sync();
    cin.getline(ntbk.model, 21, '\n');
    if(cin.fail()){
        cerr << "Ошибка! Ввод названия модели завершился неудачно! Операция ввода отменена!" << endl;
        bErr = true;
        return;
    }

    cout << "Введите значение цены ноутбука (unsigned short int): ";
    cin >> ntbk.price;
    if(cin.fail()){
        cerr << "Ошибка! Ввод значения цены ноутбука завершился неудачно! Операция ввода отменена!" << endl;
        bErr = true;
        return;
    }

    cout << "Введите значение массы ноутбука в граммах (unsigned short int): ";
    cin >> ntbk.weight;
    if(cin.fail()){
        cerr << "Ошибка! Ввод значения массы ноутбука завершился неудачно! Операция ввода отменена!" << endl;
        bErr = true;
        return;
    }

    cout << "Введите значение длины ноутбука в миллиметрах (unsigned short int): ";
    cin >> ntbk.size_x;
    if(cin.fail()){
        cerr << "Ошибка! Ввод значения длины ноутбука завершился неудачно! Операция ввода отменена!" << endl;
        bErr = true;
        return;
    }

    cout << "Введите значение ширины ноутбука в миллиметрах (unsigned short int): ";
    cin >> ntbk.size_y;
    if(cin.fail()){
        cerr << "Ошибка! Ввод значение ширины ноутбука завершился неудачно! Операция ввода отменена!" << endl;
        bErr = true;
        return;
    }

    cout << "Введите значение высоты ноутбука в миллиметрах (unsigned short int): ";
    cin >> ntbk.size_z;
    if(cin.fail()){
        cerr << "Ошибка! Ввод значения высоты ноутбука завершился неудачно! Операция ввода отменена!" << endl;
        bErr = true;
        return;
    }

    cout << "Введите значение частоты процессора ноутбука в МГц (unsigned short int): ";
    cin >> ntbk.diagonal;
    if(cin.fail()){
        cerr << "Ошибка! Ввод значения частоты процессора ноутбука завершился неудачно! Операция ввода отменена!" << endl;
        bErr = true;
        return;
    }

    bErr = false;
}


int _tmain(int argc, _TCHAR* argv[])
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);

        fstream File;
    string base_file, file;
    base_file = "notebook.dat";
    file = "ntbk.dat";

    File.open(file.c_str(), ios::in);
    if(File.is_open()){
        File.close();
        remove(file.c_str());
    }
    else
        File.close();

    unsigned int size;
    File.open(base_file.c_str(), ios::in);
    if(File.is_open()){
        File.read((char *)(&size), 4);
        File.close();
    }
    else{
        cerr << "Ошибка! Не удалось открыть файл " << base_file << "!" << endl;
        return 1;
    }

    NTBK *buf = new NTBK[size];
    unsigned int cnt = 0;
    bool bErr;
    NTBK ntbk;
    for(int i = 0; i < size; ++i){
        GetFromBaseFile(base_file.c_str(), ntbk, i, bErr);

        if(ntbk.diagonal > 279){
            strcpy_s(buf[cnt].model, 21, ntbk.model);
            buf[cnt].price = ntbk.price;
            buf[cnt].weight = ntbk.weight;
            buf[cnt].size_x = ntbk.size_x;
            buf[cnt].size_y = ntbk.size_y;
            buf[cnt].size_z = ntbk.size_z;
            buf[cnt].diagonal = ntbk.diagonal;
            ++cnt;
        }
    }

    for(int i = 0; i < cnt; ++i)
        disp(buf[i]);    

    return 0;
}


новая редакция

Это сообщение отредактировал(а) fprg - 24.8.2010, 05:58
PM MAIL   Вверх
mes
Дата 12.8.2010, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(fprg @  12.8.2010,  18:11 Найти цитируемый пост)
все очень просто, проще некуда. 

Вот именно, раз все так просто сами и исправьте ошибку..
а Вы вместо этого предлагаете читать почти 500 строчек кода людям, которым эта писанина абсолютно не нужна ..
 smile

Добавлено через 1 минуту и 32 секунды
Цитата(fprg @  12.8.2010,  20:18 Найти цитируемый пост)
Код начал работать нормально

поздравляю ) немного старания и все получится )


--------------------
PM MAIL WWW   Вверх
fprg
Дата 12.8.2010, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 10.8.2010

Репутация: нет
Всего: нет



Причем тут старания? 
Первоначальный код ведь тоже работает! И любой мог бы проверить первые 10 вариантов и все было бы ок.
Но я потому и обратился за помощью что не знаю почему вдруг код перестает нормально работать после 10 первых удачных операций записи.
Чтобы обойти проблемУ с выравниванием использовал буферы, такой проблемы просто не должно было быть.
Если бы прочитали код, то обратили бы внимание на эти детали. smile 

Это сообщение отредактировал(а) fprg - 12.8.2010, 21:42
PM MAIL   Вверх
mes
Дата 12.8.2010, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(fprg @  12.8.2010,  20:39 Найти цитируемый пост)
г код перестает нормально работать после 10 первых удачных операций записи.

во первых больше 10 операций - это цикл из двух строчек, плюс еще 10, ну пусть 20 строчек, но не 500 же ?!
ведь чтоб дойти до ваших комментов надо как минимум пролистнуть это.. 
Вобщем пожалейте чужие глаза и силы  smile

Добавлено через 56 секунд
Цитата(fprg @  12.8.2010,  20:39 Найти цитируемый пост)
Если бы прочитали код,

если б было 20 строчек, может быть и прочитал бы ) а так ждите у кого глаза бесплатные )

Добавлено через 3 минуты и 24 секунды
Цитата(fprg @  12.8.2010,  20:39 Найти цитируемый пост)
Причем тут старания? 

а старания при том, что Вы захотели, чтоб Вам сделали приятно (помочь найти ошибку)
а сами даже не постарались создать приятные условия для этого.

Это так Вам на будущее smile Чем больше стараний Вы вложите, тем охотнее Вам ответят..



--------------------
PM MAIL WWW   Вверх
fprg
Дата 12.8.2010, 22:00 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 10.8.2010

Репутация: нет
Всего: нет



Сохранять что либо в файлах в своих программах используя fstream не судьба? smile

Добавлено через 4 минуты и 15 секунд
Попробуйте просто ради прикола сохранить несколько экземпляров структуры в файл с тем чтобы когда-нибудь их извлечь.
И тогда я посмотрю на Ваши танцы с бубнами вокруг fstream.
 smile 
PM MAIL   Вверх
azesmcar
Дата 13.8.2010, 07:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(fprg @  12.8.2010,  22:00 Найти цитируемый пост)
Попробуйте просто ради прикола сохранить несколько экземпляров структуры в файл с тем чтобы когда-нибудь их извлечь.

Ну спасибо что сообщил, как же мы тут все не додумались за всю жизнь запихнуть структуру в файл? Даже странно...жаль тебя разочаровывать, но проблемы подобного рода говорят о чьем-то нежелании читать документацию.
Еслиб ты выделил неработающий кусок размером в 20-30 хрен с ним в 50 строк кода то быстро получил бы ответ, а ты забросил сюда 500 строк абсолютно нечитабельного кода и хочешь, чтоб все кинулись на него с отладчиком? При попытке отделить неработающий кусок кода ты скорее всего сам найдешь ошибку, а если не найдешь так хотя бы предоставишь возможность тебе помочь.


PM   Вверх
djamshud
Дата 13.8.2010, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 4
Всего: 39



fprg, вам все правильно сказали. Хотите помощи - умейте задавать вопрос и локализовать свою проблему в пятидесяти-сотне строках кода. Разбирать, как работает программа в половину тысяч строк, всем влом. А в каком месте она начинает работать не так - и подавно.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
fprg
Дата 13.8.2010, 11:36 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 10.8.2010

Репутация: нет
Всего: нет



Цитата

Ну спасибо что сообщил, как же мы тут все не додумались за всю жизнь запихнуть структуру в файл? Даже странно...жаль тебя разочаровывать, но проблемы подобного рода говорят о чьем-то нежелании читать документацию.
Еслиб ты выделил неработающий кусок размером в 20-30 хрен с ним в 50 строк кода то быстро получил бы ответ, а ты забросил сюда 500 строк абсолютно нечитабельного кода и хочешь, чтоб все кинулись на него с отладчиком? При попытке отделить неработающий кусок кода ты скорее всего сам найдешь ошибку, а если не найдешь так хотя бы предоставишь возможность тебе помочь.


Еслиб ты попытался бы вникнуть, то речи о неработающем куске кода не завел.
Не хочешь читать код, не читай, я уже сам разобрался.
По прежнему считаю что ты неправ.
Не просто неправ, но и еще и с претензиями...
PM MAIL   Вверх
azesmcar
Дата 13.8.2010, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(fprg @  13.8.2010,  11:36 Найти цитируемый пост)
По прежнему считаю что ты неправ.
Не просто неправ, но и еще и с претензиями... 

Это твое личное дело, только у меня нет претензий, если ты еще не понял я тебе помогаю, помогаю получить ответ в следующий раз, когда возникнет проблема, потому-что следующую тему в таком виде наверняка все просто проигнорируют.

Удачи.

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0757 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.