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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.11.2013, 16:18   #1
Diana528
Форумчанин
 
Регистрация: 13.02.2013
Сообщений: 221
По умолчанию работа с файлами

Не могу разобраться, как сделать так чтобы можно было добавить запись в файл((

Код:
else
 if (strcmp(r, "save_to_file") == 0)
{
fstream f1("asd.fbd", ios::binary|ios::out);
    f1.write((char *)&medicines,sizeof(Remedy));
	f1.close();
		   }
else
 if (strcmp(r, "read_from_file") == 0)
{char w[lname];
fstream f("asd.fbd", ios::binary|ios::in);
	f.read((char *)&medicines,sizeof(Remedy));
	cout<<"Введите название файла fbd: ";
	f>>w;
	cout<<endl;
	cout<<"Файл "<<f<<" был введен в таблицу";
    f.close();
	system("dir");
	}
Diana528 вне форума Ответить с цитированием
Старый 03.11.2013, 17:29   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Код:
fstream f1("asd.fbd", ios::binary|ios::out);
f1.seekg(0,ios_base::end); // Топаем в конец файла.
    f1.write((char *)&medicines,sizeof(Remedy));
	f1.close();
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.11.2013, 17:41   #3
Diana528
Форумчанин
 
Регистрация: 13.02.2013
Сообщений: 221
По умолчанию

В смысле в конец файла? Для чего это?

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


Код:
void PharmAP::cnslCmd()
{	wchar_t w[lname];
wcout<<L"Введите название аптеки: ";
wcin.getline(w, lname);
wcout<<w<<": ";
	char r[100]; 
	cout<<"Введите команду: ";
cin>>r;

while (strcmp(r, "stop") != 0)
{
if (strcmp(r, "add_med") == 0)
{
Remedy x;
x.read();
nmedicines++;
medicines[nmedicines - 1] = new Remedy;
*medicines[nmedicines - 1] = x;
}
else
 if (strcmp(r, "del_last_med") == 0)
{
if (nmedicines > 1)
{
nmedicines--;
} cout<<"Последнее лекарство удалено!"<<endl;
} 
else 
 if (strcmp(r, "show") == 0)
{cout<<endl;
cout<<"Список лекарств: "<<endl;
for (int i = -0; i<nmedicines; i++)
{
medicines[i]->show();
} 
} 
else 
 if (strcmp(r, "help") == 0)
{ cout<<endl;
cout<<"add_med-добавить лекарство"<<endl;
cout<<"del_last_med-удалить последнее лекарство"<<endl;
cout<<"show-показать список лекарств"<<endl;
cout<<"save_to_file-запись в файл"<<endl;
cout<<"read_from_file-чтение с файла"<<endl;
cout<<"stop-завершение работы"<<endl;
}
else
 if (strcmp(r, "save_to_file") == 0)
{ char w[lname];
fstream f1(w, ios::binary|ios::out);
    f1.write((char *)&medicines,sizeof(Remedy));
	f1.close();
			   }
else
 if (strcmp(r, "read_from_file") == 0)
{char w[lname];
fstream f(w, ios::binary|ios::in);
	f.read((char *)&medicines,sizeof(Remedy));
	f.close();
	for  (int i=1; i<=nmedicines; i++) medicines[i-1]->show();
	system("dir");
	cout<<"Введите название файла ";
	cin>>w;
	
	}
else cout<<"Неверная команда / Справка по командам - help";
cout<<endl;
wcout<<w<<": ";
cout<<"Введите команду: ";
cin>>r;
}
};

void PharmAP::save_file()
{char w[lname];
	fstream f1(w, ios::binary|ios::out);
    f1.write((char *)&medicines,sizeof(Remedy));
	f1.close();
	
	    	};
void PharmAP::read_file()
{char w[lname];
	fstream f(w, ios::binary|ios::in);
	f.read((char *)&medicines,sizeof(Remedy));
    f.close();
	for  (int i=1; i<=nmedicines; i++) medicines[i-1]->show();
	
};

Последний раз редактировалось Stilet; 03.11.2013 в 17:53.
Diana528 вне форума Ответить с цитированием
Старый 03.11.2013, 17:50   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Понятие "добавлять записи" для меня лично эквивалентно "дописать в конец".
Если я не прав то поясняй задачу подробнее.
Цитата:
Мне нужно чтобы у пользователя была возможность ввести название файла, а затем чтобы программа сохранила мой список лекарств в этот файл(т.е. в тот файл, которому задал имя)
Теперь я запутался.
Ты хочешь создать файл с нуля и в него вписать блоки информации, или дописать к уже имеющимся в открытом файле?
I'm learning to live...

Последний раз редактировалось Stilet; 03.11.2013 в 17:54.
Stilet вне форума Ответить с цитированием
Старый 03.11.2013, 18:09   #5
Diana528
Форумчанин
 
Регистрация: 13.02.2013
Сообщений: 221
По умолчанию

у меня есть переменная w - это имя файла, которое пользователь будет вводить с консоли...получается что он записывает в этот w список лекарств, следовательно пользователь ввел название файла "asd.fbd" (например) затем при помощи функций добавляет лекарства, далее сохраняет эти лекарства в при помощи функции save_to_file а после при помощи функции read_from_file считывает их...затем я пишу "stop" - и завершаю работу программы...а потом включаю снова и сразу ввожу функцию read_from_file и он мне дает возможность ввести название файла "asd.fbd" и собственно показывает список лекарств, который я сохранила еще тогда...все вроде бы работает, но вот к сожалению списка не выводит (пустой список)...да еще к тому же название странное у файла получается((

Последний раз редактировалось Diana528; 03.11.2013 в 18:13.
Diana528 вне форума Ответить с цитированием
Старый 03.11.2013, 19:44   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я... это... Просто так ссылку тут оставлю...
http://www.programmersforum.ru/showthread.php?t=105501
Вдруг она подскажет тебе более надежное решение.
Честно, запутался в твоем коде. Как-то сложно получилось.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 04.11.2013, 01:10   #7
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

У тебя несколько проблем в коде.

Первая -
Код:
char w[lname];
fstream f1(w, ios::binary|ios::out);
как ты думаешь, чему будет равно имя созданного файла здесь? )

Вторая (и самая главная) -
Код:
f1.write((char *)&medicines,sizeof(Remedy));
medicines - массив указателей, его в файл писать бессмысленно, не так ли? ) Нужно либо превратить его в массив значений и записать одним махом, либо обойти в цикле и записать каждое значение отдельно. Первое проще, если структура remedy сама не содержит указателей. Все это точно так же относится и к чтению, да.

И еще пачка мелочей - не освобождается память при удалении записей, в одном месте цикл зачем-то написан от 1 до n. Еще там что-то было, забыл.

P.S. В подобных случаях не обязательно писать close() для потоков, они автоматически закроются при выходе из блока.
Son Of Pain вне форума Ответить с цитированием
Старый 04.11.2013, 09:26   #8
Diana528
Форумчанин
 
Регистрация: 13.02.2013
Сообщений: 221
По умолчанию

у меня итак массив значений...
Код:
class Pharma: public Pharmacy
{
Remedy medicines[max_nmedicines];
public: 
	void show();
	void save_file();
	void read_file();
    void add_medicines(Remedy); 
    void del_last_medicines(); 
Remedy *find_name(wchar_t *name);
};
и можно подробнее о первой проблеме? какую нужно создать переменную?

Последний раз редактировалось Diana528; 04.11.2013 в 09:45.
Diana528 вне форума Ответить с цитированием
Старый 04.11.2013, 10:11   #9
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Цитата:
Сообщение от Diana528 Посмотреть сообщение
у меня итак массив значений...
А как тогда работает это? )
Код:
medicines[nmedicines - 1] = new Remedy;
*medicines[nmedicines - 1] = x;
Или код менялся с того времени?

Цитата:
и можно подробнее о первой проблеме? какую нужно создать переменную?
У тебя уже есть правильная переменная с именем файла в начале функции. Зачем ты создаешь еще два пустых массива w?
Son Of Pain вне форума Ответить с цитированием
Старый 04.11.2013, 10:29   #10
Diana528
Форумчанин
 
Регистрация: 13.02.2013
Сообщений: 221
По умолчанию

а как мне тогда ее считать???
Код:
string w;
fstream f("asd.fbd", ios::binary|ios::in);
	f.read((wchar_t *)&nmedicines,sizeof(Remedy));
	f.close();
	//for (int i = 0; i<nmedicines; i++)
//{
//medicines[i]->show();
//} 
	system("dir");
	cout<<"Введите название файла ";
	cin>>w;//в этом месте я не права(
Diana528 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с файлами _SOKOL_ Общие вопросы C/C++ 0 09.02.2013 15:37
Работа с файлами. С M_Asja Помощь студентам 1 19.01.2013 11:34
Работа с файлами на Си romant1komg Помощь студентам 0 01.02.2012 21:31
работа с файлами Funy Помощь студентам 0 16.01.2012 15:44
работа с файлами dima0268 Общие вопросы C/C++ 1 15.12.2009 17:22