Работа с текстовыми файлами

Тема в разделе "MS Visual C++", создана пользователем Skyler, 23 апр 2008.

  1. Skyler

    Skyler Гость

    Здравствуйте, уважаемые господа!
    Прежде всего хочу выразить всем огромную благодарность за оказанную мне, как новичку, помощь!
    За время пребывания на форуме я у вас много чему научился, но "текущую" проблему решить не могу :)
    Вобщем мне нужно предоставить пользователю возможность выбора в программе некоторой стандартной продукции (к примеру, силовые электрические кабеля) программа должна "знать" их маркировку, технические характеристики и т.д. (двумерная таблица с несколькими столбцами). Когда я "писал" на VB, я просто "забивал" все в текстовые документы и потом, при запуске, программа считывала данные из этих файлов и "фасовала" их по соответствующим массивам.
    Подскажите пожалуйста как разрешить эту проблему в MFC. Заранее благодарен!
     
  2. Skyler

    Skyler Гость

    это очень плохо, так-как на изучение XML у меня просто не хватит времени... :eek: а мож хоть как-нибудь, данные даже не нужно динамически изменять или добавлять... :) хоть возьми да пропиши все прайсы в коде... :)
     
  3. gamecreator

    gamecreator Гость

    а почему аналогичный подход, описанный для бейсика не подходит для С++?
     
  4. Skyler

    Skyler Гость

    программа (пишет/читает) свои собственные документы посредством сериализации. файлы ж этой "базы данных" должны иметь иную структуру. возможно ли их сериализировать и как - я не знаю. в бейсике эти данные я писал в блокноте, а программа их читала в формате String (по-моему ф-ция ReadLine). как это сделать в MFC я, увы, тож не знаю ;)
     
  5. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Расскажите подробнее про структуру, может поможем
     
  6. Skyler

    Skyler Гость

    в этих файлах должны быть данные о продукции. покажу пример на тех же силовых кабелях:
    марка кабеля: ААшВ;
    номинальное сечение= 35;
    придельный ток= 200;
    удельное электрическое сопротивление=0,035;
    ...
    цена=5200.
    Программа должна предоставить пользователю выбрать марку кабеля, например, из списка, а остальные характеристики "подтянуть" для дальнейших расчетов. мне нужно узнать как можно читать ети данные из файлов и в какие файлы их лучше набрать.
    Сериализация здесь, по-моему, не подойдет, т.к. она записывает и востанавливает из файла данные-члены классов, объявленых в программе.
    Спасибо :)
     
  7. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Это лежит в текстовом файле в таком виде? Мда... Глупее идею сложно придумать.
    Что Вам мешает открыть файл и напрямую читать из него данные?
     
  8. Skyler

    Skyler Гость

    практически (только цифры)... согласен, что глупо, но тогда ничего другог в голову не пришло.
    Во первых, я не знаю как сохранить данные в таком файле (грубо говоря, куда это все набирать, если не в блокнот :) ), а во-вторых - какими средствами MFC их оттуда читать
     
  9. gamecreator

    gamecreator Гость

    fstream
     
  10. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Для упрощения работы с файлами в MFC есть класс CFile (смотрите методы Read и Write)
     
  11. alexroot

    alexroot Гость

    Делаешь текстовый файл bd.txt с таким содержимым

    Код (Text):
    ААшВ 35 200 0.035 5200
    ББвШ 40 200 0.055 5999
    читаешь его используя fstream

    Например вот одна функция которой я читаю данные из текстового файла состоящего из двух столбцов

    Код (Text):
    int vectors::set_vec_geolvert ( std::vector<data_geolvert>& mrvec_geolvert, int& ri_verbose )
    {
    try
    {
    ifstream    fi_geolvert ( F_GEOLVERT, C_IOS_IN | C_IOS_NOCREATE );
    if ( !fi_geolvert )
    {
    cout << "File " << F_GEOLVERT << " not found or such directory not created." << endl;
    throw vectors::ex_error();
    }

    mrvec_geolvert.clear();

    char    c_strtemp[128];
    int     i_num_tip_str = 0;
    int     i_nazv_ige = 0;
    double  d_otm_podoshvi_ige = 0.0;
    bool    b_its_geolvert;
    data_geolvert   Data_geolvert;
    data_geolvert_ige   Data_geolvert_ige;

    b_its_geolvert = false;
    while (!fi_geolvert.eof () )
    {
    fi_geolvert >> c_strtemp;
    if (fi_geolvert.eof () )
    break;
    if (c_strtemp[0] == '{')
    {
    b_its_geolvert = true;
    i_num_tip_str++;
    continue;
    }
    if (c_strtemp[0] == '}')
    {
    b_its_geolvert = false;
    continue;
    }

    if (b_its_geolvert)
    {
    i_nazv_ige = atoi (c_strtemp);

    fi_geolvert >> d_otm_podoshvi_ige;
    if (fi_geolvert.eof () )
    {
    cout << "ERROR: in file " << F_GEOLVERT << endl;
    throw vectors::ex_error ();
    }

    Data_geolvert_ige.set_num_ige ( i_nazv_ige );
    Data_geolvert_ige.set_otm_podoshvi_ige ( d_otm_podoshvi_ige );

    Data_geolvert.set_num_tip_str ( i_num_tip_str );
    Data_geolvert.getr_geolvert_ige ().push_back ( Data_geolvert_ige );

    mrvec_geolvert.push_back(Data_geolvert);
    }
    }
    }
    catch (vectors::ex_error) { return 1; }
    return 0;
    }
    а пишу в файл например так

    Код (Text):
    // печать вектора показателей потери несущей способности сваи в файл F_STNLOSS

    int vectors::print_vec_stnloss (data_vecs&  rvecs)
    {
    try
    {
    int     i_cycle1;
    ofstream    fo_stnloss (F_STNLOSS, ios::out);
    if (!fo_stnloss)
    {
    cout << "ERROR: Can't open file " << F_STNLOSS << endl;
    throw vectors::ex_error ();
    }
    for (i_cycle1 = 0; i_cycle1 < (int) rvecs.mvec_stnloss.size (); i_cycle1++)
    {
    fo_stnloss << rvecs.mvec_stnloss[i_cycle1].get_num_fe () << "\t" <<
    rvecs.mvec_stnloss[i_cycle1].get_stnloss () << endl;
    }
    fo_stnloss.close ();
    }
    catch (vectors::ex_error) {return 1;}
    return 0;
    }
     
  12. Dimmuborgir

    Dimmuborgir Гость

    для alexroot: да вы просто маньяк)
    PS:
    шутник))
     
  13. alexroot

    alexroot Гость

    Самоучка :unsure:

    Если что не так - пишите. Не вижу ничего крамольного в выделенной выше строке кода :)

    Но мой пример, видимо, должен работать и для МFC приложения,
    достаточно включить fstream.

    Когдато я писал и с интерфейсом используя MFC,
    и пользовался именно библиотекой fstream. Все прекрасно работало.

    Но у меня нет столько времени для картинок, поэтому пока пишу только
    консольные приложения, которые больше приносят пользы чем GUI MFC ;)
     
  14. Dimmuborgir

    Dimmuborgir Гость

    для sax_ol: если честно, мне по работе не приходилось встречать больших объемов данных. Все задачи с которыми я на данный момент сталкивался (в области энергетики) решались очень легко с помощью простых текстовых файлов. Иногда еще бинарных. )

    для alexroot: я имел ввиду длинное название переменных цикла, кои зачасту применяются многократно внутри последнего. может дело вкуса конечно) копипаст всегда поможет.)
     
Загрузка...

Поделиться этой страницей