• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

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

  • Автор темы Skyler
  • Дата начала
S

Skyler

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

Skyler

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

gamecreator

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

Skyler

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

Skyler

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

European

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

Skyler

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

European

Во первых, я не знаю как сохранить данные в таком файле (грубо говоря, куда это все набирать, если не в блокнот smile.gif ), а во-вторых - какими средствами MFC их оттуда читать
Для упрощения работы с файлами в MFC есть класс CFile (смотрите методы Read и Write)
 
A

alexroot

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

Код:
ААшВ 35 200 0.035 5200
ББвШ 40 200 0.055 5999

читаешь его используя fstream

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

Код:
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;
}

а пишу в файл например так

Код:
// печать вектора показателей потери несущей способности сваи в файл 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;
}
 
A

alexroot

для alexroot: да вы просто маньяк)
Код:
for (i_cycle1 = 0; i_cycle1 < (int) rvecs.mvec_stnloss.size (); i_cycle1++)

Самоучка :unsure:

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

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

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

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

Dimmuborgir

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

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!