![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Frekenbok |
|
||||||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 29.10.2006 Репутация: 1 Всего: 1 |
Привет всем!
У меня такая проблемка возникла. Нужно записать список в файл и считать из файла. Проблема, собственно, именно с полем типа char в структуре. Компилятор древний Borland Turbo C++ 3.0. Вот сама структура:
Начнем с того, что не могу записать строку в поле name (ввести с клавиатуры).
Так не получается. Пробовала так: cin>>last->name. Потом прочитала, что для пользовательских типов надо перегружать оператор >>. А я этого пока не умею. Хотелось бы попроще, если можно, без наворотов типа классы, пергрузка операторов и т.п. Еще пробовала cin.getline(last->name, 20). Тоже ругается. Еще был вариант такой:
Для записи в файл использую дополнительную переменную buf типа node. Элементы списка сначала записываю в buf, потом в файл.
Как в поле структуры buf.name записать содержимое cur->name??? А вот считывание из файла:
Собственно, вся проблема, наверное, в этом поле name. Оно все портит ![]() Друзья, помните, перед вами новичок! ![]() |
||||||||||
|
|||||||||||
vinter |
|
||||||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
last->name не пользовательский тип данных, а обычный char массив, last вот это пользовательский тип данных, у тебя вся проблема в выделении памяти, а вообще если пишешь на С, то пиши на С, зачем его с С++ мешать??
|
||||||
|
|||||||
PoloS |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 89 Регистрация: 29.12.2006 Где: МО, г. Одинцово Репутация: 1 Всего: 5 |
так не пишется! имя массива name и есть указатель первого элемента, надо так
|
||||
|
|||||
kot_matros |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 11.1.2007 Репутация: нет Всего: нет |
В современных делается так-же |
|||
|
||||
Vsts |
|
||||||||||||||||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 10.1.2007 Репутация: нет Всего: 1 |
ага, еще и не удачный... если есть возможность лучше выкинуть. Какие ошибки компиляции там могут быть не могу предположить.Но .. 1)
так не делай. Ты не можешь в этом случае обезопаситься от переполнения. лучше что нить такое
только если используються спец символы (типа F1 , или backspace) , то придеться доделать.. вместо "strcpy(cur->name, str); " сделай так
и используй лучше вместо strcpy(..) strncpy(..) .избежишь кучу проблем
после f=fopen("toys.dat","wb+"); стоит проверку сделать if(f == NULL) return; //или что то еще .. по контексту када в файл пишешь, смотри что бы fwrite(&buf,sizeof(buf),1,f) == sizeof(buf) // тоже полезно тоже самое при чтении fread(&buf, sizeof(buf), 1, f) == sizeof(buf) .. (это может быть чаще, например кто то дописал специально в конец файла что нить... )
Тогда уже так
Это сообщение отредактировал(а) Vsts - 12.1.2007, 21:00 |
||||||||||||||||
|
|||||||||||||||||
Frekenbok |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 29.10.2006 Репутация: 1 Всего: 1 |
Vsts, спасибо за развернутый ответ. Чувствуется рука профессионала. У меня, конечно, учебная задачка, поэтому многое не предусмотрено, но учту на будущее.
Работает ![]() Так тоже ошибок не выдает. Но вот проблема, как-то в список все, видимо, коряво записывается. В общем, проблем со списками до этого не было. А тут при выводе получается ерунда. Еще раз приведу кусочки кода.
Ввожу такие значения: Введите name: мяч Введите price: 100 Введите minage: 1 Введите maxage: 5 Введите name: кукла Введите price: 240 Введите minage: 3 Введите maxage: 7 Когда вывожу список, получаю вот что: мяч, цена - 36780 коп., от 100 до 1 лет кукла, цена - 36780 коп., от 240 до 3 лет В общем происходит какой-то сдвиг значения ![]() |
||||
|
|||||
zkv |
|
|||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 26 Всего: 92 |
а как сам процесс ввода проходит? нормально? а то похоже, что мусор у тебя в прайс лезет при вводе. Код вроде нормальный, на первый взгляд, одно не нравится, используешь средства ввода\вывода как Си так и С++ одновременно, может конечно ничего страшного и нет, а может и проблемы из за этого, и еще:
зачем столько гемороя, Vsts тебе про другое говорил, а если уж ты решишь воспользоваться средствами С++, то пиши просто:
PS заметил, что в теме ты указал язык Си, в этом случае про cin и string можно забыть... |
|||
|
||||
Vsts |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 10.1.2007 Репутация: нет Всего: 1 |
сотри если не тяжело ![]()
поэтому сразу учись на все обращать внимание . вот, попробуй.Должно получиться, если скомпилиться.У меня твоего компилятора нет. Старался как можно меньше поправок делать
ПыСы када с файлами работаешь не забудь проверять(не ленись вставить) проверки всякие разные. Это сообщение отредактировал(а) Vsts - 13.1.2007, 19:45 |
||||||
|
|||||||
kot_matros |
|
||||||
![]() Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 11.1.2007 Репутация: нет Всего: нет |
Я пододобное как-раз просматривал
Вот вариант как можно забивать структуру
А вот как забить из фаулта
т.к ф коде нет проверок на ошибки файл должен быть точно такого вида:
|
||||||
|
|||||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |