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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.01.2013, 21:28   #31
Vlad9999
Пользователь
 
Регистрация: 14.01.2013
Сообщений: 33
По умолчанию

Спасибо этот вариант работает.
PHP код:
Edit2->Text=AnsiString(Programs.Program_name.c_str()); 
Но теперь возникли следующие проблемы, не получается корректно сохранить структуру в файл.

записываю:
PHP код:
FILE *fp=NULL;
fp fopen("data.bin","w");
fwrite(&Programs,sizeof(Programs),1,fp);
fclose(fp); 
читаю:
PHP код:
FILE *fp=NULL;
fp=fopen("data.bin","r");
fread(&Programs,sizeof(Programs),1,fp);
fclose(fp); 
Все элементы структуры читаются нормально кроме строки.

И еще просьба, не могли бы мне объяснить .c_str()
что это вообще за зверь?
Vlad9999 вне форума Ответить с цитированием
Старый 15.01.2013, 22:03   #32
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Чтение и запись надо бы выполнять по каждому полю структуры отдельно.
c_str() - метод доступа к указателю на реальные данные строки.
EUGY вне форума Ответить с цитированием
Старый 15.01.2013, 22:40   #33
Vlad9999
Пользователь
 
Регистрация: 14.01.2013
Сообщений: 33
По умолчанию

А вот это уже интересно. А как это делается?

Цитата:
c_str() - метод доступа к указателю на реальные данные строки.
А почему его к Programs.Program_name можно применять? Почему к Edit - понятно.
Vlad9999 вне форума Ответить с цитированием
Старый 15.01.2013, 22:54   #34
sVasilich
Форумчанин
 
Аватар для sVasilich
 
Регистрация: 16.12.2009
Сообщений: 224
По умолчанию

Цитата:
А почему его к Programs.Program_name можно применять? Почему к Edit - понятно.
Ну, потому, что std::string имеет такой метод))

http://www.cplusplus.com/reference/string/string/

смотри в конце, там где String operations.
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...
sVasilich вне форума Ответить с цитированием
Старый 15.01.2013, 23:08   #35
Vlad9999
Пользователь
 
Регистрация: 14.01.2013
Сообщений: 33
По умолчанию

Спасибо, торможу, у меня в голове до сих пор char[].

Цитата:
Чтение и запись надо бы выполнять по каждому полю структуры отдельно.
Растолкуйте, пожалуйста, если не сложно.
Vlad9999 вне форума Ответить с цитированием
Старый 15.01.2013, 23:19   #36
sVasilich
Форумчанин
 
Аватар для sVasilich
 
Регистрация: 16.12.2009
Сообщений: 224
По умолчанию

Ну тут всё просто: записываешь в файл не всю структуру за раз, а каждое поле по отдельности (считал значение первого поля - записал в файл, считал второе - записал в файл и т.д.).

И чтение из файла точно такое же: считал значение всех полей одного элемента структуры - создал новый элемент на основании считанных данных.

Например как-то так (пишу сразу сюда, поэтому, наверное, куча ошибок):
Код:
struct  pr{
  int a;
  int b;
};

pr program;
//запись
FILE *fp=NULL; 
fp = fopen("data.bin","w"); 
fwrite(&program.a,sizeof(int),1,fp); 
fwrite(&program.b,sizeof(int),1,fp); 
fclose(fp);  

//чтение
FILE *fp=NULL; 
fp=fopen("data.bin","r"); 
pr newProgram;
fread(&newProgram.a,sizeof(int),1,fp); 
fread(&newProgram.b,sizeof(int),1,fp); 
fclose(fp);
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...
sVasilich вне форума Ответить с цитированием
Старый 15.01.2013, 23:29   #37
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Код:
	
// запись каждого поля отдельно
fwrite(&Programs.check_period, sizeof(int), 1, fp); 
//....
fwrite(Programs.Program_name.c_str(), sizeof(char), Programs.Program_name.length() + 1, fp); 
//....

Код:
//чтение каждого поля отдельно
fread(&Programs.check_period, sizeof(int), 1, fp); 
	
//неизвестная длина строки
//читаем посимвольно до встречи \0
while (true)
{
	char x;
	fread(&x, sizeof(char), 1, fp);
	if (x)
		Programs.Program_name += x;
	else
		break;
}
Не поверял, поэтому вдумчиво подходить

Последний раз редактировалось EUGY; 15.01.2013 в 23:34. Причина: Поправил
EUGY вне форума Ответить с цитированием
Старый 16.01.2013, 00:42   #38
Vlad9999
Пользователь
 
Регистрация: 14.01.2013
Сообщений: 33
По умолчанию

А можно, к примеру, отвязать Program_name от структуры, создав отдельную переменную, но сохранять структуру и переменную в один файл?
Vlad9999 вне форума Ответить с цитированием
Старый 16.01.2013, 00:54   #39
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Цитата:
А можно, к примеру, отвязать Program_name от структуры, создав отдельную переменную, но сохранять структуру и переменную в один файл?
Не желаем отказываться от удобного fwrite(&Programs, sizeof(Programs) ?
Вообщем можно, только в любом случае переменную типа std::string придется читать/записывать в файл особым способом, а не просто передачей ее адреса.
EUGY вне форума Ответить с цитированием
Старый 16.01.2013, 01:03   #40
Vlad9999
Пользователь
 
Регистрация: 14.01.2013
Сообщений: 33
По умолчанию

Так точно, не желаем. Это понял, поэтому и спросил. Главное, что в один файл можно. Жаль, что нельзя каким-либо примитивным способом ограничить длину строки например как в Delphi, - string[3].
Vlad9999 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка в структурах[C++] druger Помощь студентам 0 22.03.2012 19:07
не совсем понял пример в методичке о структурах (С++) severest Общие вопросы C/C++ 1 18.04.2011 20:01
Работа с файлами в структурах ХреновыйПрогер Общие вопросы C/C++ 5 23.12.2010 21:46
Массивы и структуры в структурах (Задача в С++) bel_ka Общие вопросы C/C++ 4 16.12.2007 15:31