Премини към съдържанието
Форумът в приложение

По-лесно сърфиране. Научи повече.

Kaldata.com - Форуми

Приложение на форума на цял екран с push известия, значки и други.

За да инсталирате това приложение на iOS и iPadOS
  1. Докоснете Иконата за споделяне в Safari
  2. Превъртете менюто и докоснете Добавяне към началния екран.
  3. Докоснете Добавяне в горния десен ъгъл.
За да инсталирате това приложение на Android
  1. Докоснете менюто с 3 точки (⋮) в горния десен ъгъл на браузъра.
  2. Докоснете Добавяне към началния екран или Инсталиране на приложение.
  3. Потвърдете, като докоснете Инсталиране.

Добре дошли!

Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

Моля, регистрирайте се за да публикувате тема и да получите пълен достъп до всички функции.

 

Проблем с файлов вход/изход

Featured Replies

Здрасти мафия!

Опитвам се да направя програма, която да регистрира жител (с трите имена, град, адрес, години и заетост) и ако той е студент, програмата да иска университет, факултет, специалност, ако е ученик да иска име на даскалото, ако е работник - фирма, специалност, длъжност и ако е безработен - дали е зарегистриран.

Данните трябва да се запазват във бинарен файл.

Това, което съм направил досега:

// Трия кода за да не ми го крадат колеги и да ме скъсат 

Когато регистрирам жител, нямам проблеми, но когато изведа всички жители (опция 9) - програмата крашва и не знам какво да направя.

Тези неща с файловете не сме ги взимали на лекции или упражнения, но трябва да го направя за курсова работа...

Редактирано от eXceLLen7 (преглед на промените)

Здрасти! Като начало

#include <stdlib.h>        //#include <conio.h> - това е старо

и

вместо void main() ->  int main() 

void означава, че функцията не връща стойност.

и

не видях, къде декларираш "cls"

Редактирано от jhoro (преглед на промените)

cls e cmd команда за изчистване на екрана

Моя компилатор не е съгласен, аз се въздържам  :wink12:

void main e старото с++ 98

for (i = 0; i < pos / sizeof(person); i++)

заменете го с

while(!fp.eof())
{
}

да видим ко ще стане

 

мале то много сложно това въртят се два цикъла и се заменя с lfstream

Редактирано от petie1 (преглед на промените)

  • Автор

Същото като преди.

Само първият път ми извежда жителите и след това крашва.

Когато я пусна пак и цъкна на извеждане на жителите крашва без да ги изведе.

Въпросче

Защо в началото има

void menu();
void enter();
void izvejdane(struct person per[]);
void suzdavane();

а на ммен си ги вади всеки път и крашва

а на ммен си ги вади всеки път и крашва

при мен не крашва, ама и не дава инфо

********** MENU **********
 
1. Регистрация жител
2. Покажи броя на студентите
3. Покажи броя на учениците
4. Покажи броя на безработните
5. Покажи броя на жителите до 25 години
6. Покажи броя на студентите до 25 години
7. Покажи имената на всички безработни
8. Информация за жител по име
9. Изведи всички жители
 
 Изберете опция от 1 до 9: 9
-------------------------------------------------------------------------------
Град:  Adres: 
Години: 1217497565 Заетост: 
-------------------------------------------------------------------------------

 

 

Редактирано от jhoro (преглед на промените)

 

при мен не крашва, ама и не дава инфо

 

 

значи и при теб толкова работи.. как да я оправим тая чудесия???????

Aми мисля, че така се декларират функциите :Д

Правилно мислиш. Ако функциите се ползват преди дефиницията, трябва да се декларират.

Сега по същество, преди господата jhoro и petie1, да са набрали скорост. :P

 

1. коментарите че употребата на conio, getch и system не се препоръчва са верни, но не пречат, ако компилираш с майкрософтския компилатор.

2. Трябва да добавиш флага ios::out към флаговете когато отваряш за добавяне. Поне GCC под линукс имплементацията не желае да пише иначе.

3. Крашването е по сериозен проблем и изисква дебело обяснение за начинаещ. По-накратко:

string е клас за динамичен низ. Не е съставен само от данните за низа, не е еквивалентен на char, не може да се копира, чете или записва с операции които работят с последователни байтове.

метода write на класа ofstream(fstream) от своя страна чете побитово каквото му се даде и го записва във файл.

Тоест не може да записваш string или структури които съдържат string директно със ofstream::write. По-точно можеш :), но резултатът ще бъде много различен от очакваното. Аналогично, при опит за четене, прочиташ информация, която не e вярна и презатръшкваш памет, която не притежаваш, при което операционната система ти убива процеса.

Тоест ако желаеш да работиш със string (или какъвто и да е динамичен тип данни) трябва да извършиш операция която се казва сериализация: да си превърнеш динамичните данни в последователна поредица от байтове, които могат да се записват и от които после да може да си възстановиш обекта. Типът стринг си има метод който ти връща точно такъв тип данни - cstr().

По-лесния подход е да си модифицираш програмата да работи с масиви char вместо string.

значи и при теб толкова работи.. как да я оправим тая чудесия???????

Може да почнеш като добавиш думата "бъдещ" на подходящото място в подписа си :P После да хванеш да четеш наистина, вместо да пишеш спам по форумите. Това е сериозно - можеше да я дебъгнеш тази програма досега ако беше прочел как работят string и write.

Редактирано от flare (преглед на промените)

значи и при теб толкова работи.. как да я оправим тая чудесия???????

Като гледам как работи - какво прави:

1. main

прехвърля на

2. menu

избираш си вариант, ако е 1 - отива на 

3. enter

набираш си данните и

4. връща се пак в menu

 

в края на enter не изпълнява

fp.write((char*)&pp, sizeof(person));
fp.close();

 

...

Текстът в червено вероятно си го оцветил така защото не е верен? :D

 

Пътят към ада е застлан с добри намерения. Св. Бернар.

Текстът в червено вероятно си го оцветил така защото не е верен? :D

 

Пътят към ада е застлан с добри намерения. Св. Бернар.

защото не го прави

 

ps. уточнение - Code::Blocks + Linux

Редактирано от jhoro (преглед на промените)

защото не го прави

 

ps. уточнение - Code::Blocks + Linux

И от коя точно "точка" на функцията enter излизаме, че да не минем през тези два реда които са в края ѝ?

Уточнението е несъществено, за разлика от резултата на входно-изходните операции(примерно), поредността на изпълнението на линеен код не зависи от ос

Редактирано от flare (преглед на промените)

И от коя точно "точка" на функцията enter излизаме, че да не минем през тези два реда които са в края ѝ?

Уточнението е несъществено, за разлика от резултата на входно-изходните операции(примерно), поредността на изпълнението на линеен код не зависи от ос

изпълнението минава през операторите, на няма очаквания ефект.

уточнението беше във връзка с предишен коментар за "1. коментарите че употребата на conio, getch и system не се препоръчва са верни, но не пречат, ако компилираш с майкрософтския компилатор."

изпълнението минава през операторите, на няма очаквания ефект.

Това е тотално различно нещо от "не се изпълняват".

Функциите си се изпълняват, write връща грешка (за каквато никой не проверява :no-no: ) защото:

2. Трябва да добавиш флага ios::out към флаговете когато отваряш за добавяне. Поне GCC под линукс имплементацията не желае да пише иначе.

след което close си затваря файла.

 

Помисли над мисълта на Св.Бернар :)

Редактирано от flare (преглед на промените)

Това е тотално различно нещо от "не се изпълняват".

Функциите си се изпълняват, write връща грешка (за каквато никой не проверява :no-no: ) защото:

след което close си затваря файла.

 

Помисли над мисълта на Св.Бернар :)

след като го отваря и затваря - трябва да го има физически - нали ?

 

бях писал някъде - не ми четете думите буква по буква. не винаги се изразявам по очаквания начин

е не що не го пише нито в един учебник тва за стринговете??? ами трябва да го науча от фларе? вече ще си ползвам само чарове кат по рано:) ето научих нещо от тези разговори :)

бях писал някъде - не ми четете думите буква по буква. не винаги се изразявам по очаквания начин

Ама това са много важни разлики, не се заяждам за глупости. Значи да разбираш как върви изпълнението на кода (така наречения control flow) е изключително, ама ИЗКЛЮЧИТЕЛНО (как повече да го натъртя???) важно за всеки начинаещ и неясноти тука не трябва да има. Ако има, се зарязва всичко останало и се чете докато се изясни. Съответно, като пишеш с червени букви, че две функции в края не се изпълняват може да объркаш автора на темата.

 

след като го отваря и затваря - трябва да го има физически - нали ?

Значи в програмата има доста грешки, не са само посочените от вас и мен, аз отговорих на конкретния въпрос в темата. Не съм имал за цел да я оправям цялата, нали и авторът трябва да помисли малко.

Това че не се създава файл, става заради грешка в много по-ранен етап, файловете се създават при отваряне, не при запис или затваряне. И във всеки случай и двете функции посочени функции се изпълняват. Може да връщат грешки, но се изпълняват.

 

И за пореден път да отбележа този път директно. Аз не разбирам от коли. Няма да тръгна да оправям някому колата само щото ме е помолил, колкото и да имам доброто намерение да помогна. Нали може да предизвика катастрофа и после на моята съвест ще тежи. Моля, съобразявайте се със знанията си при опитите за помощ. Иначе вредите.

е не що не го пише нито в един учебник тва за стринговете??? ами трябва да го науча от фларе? вече ще си ползвам само чарове кат по рано :) ето научих нещо от тези разговори :)

И кой е учебника? И ако някъде кажеш, че аз съм казал да ползваш само char вместо стринг, ще се оплача на арменския поп, омбудсмана и съда в Хага. С две думи ти си го измисли това. Тоест аз пиша "това не се прави така", ти разбираш "това не може да се направи" или "въобще не трябва да се прави" или каквото там си си измислил, вместо да си зададеш правилният въпрос - щом не се прави така, то как се прави и дай да се науча аджеба да го правя като хората.

Редактирано от flare (преглед на промените)

ами много са ама такова чудо не бях чел за стринговете и файловете

например магдалина тодорова. абсолютно С++ с++ за всеки и други

ами много са ама такова чудо не бях чел за стринговете и файловете

например магдалина тодорова. абсолютно С++ с++ за всеки и други

Оффф. от поста ти съдя че нищо съществено не си разбрал.

Извинявай, ама имаш гигантски пробойни в обучението. Ако искаш може да отвориш друга тема и да си говорим за статично и динамично заделяне на паметта и как се работи с класове, които го ползват.

ще се радвам да науча нещо от всеки даже си имам темичка всичко за един лев с цел да не спамя по темите

Архивирана тема

Темата е твърде стара и е архивирана. Не можете да добавяте нови отговори в нея, но винаги можете да публикувате нова тема, в която да продължи дискусията. Регистрирайте се или влезте във вашия профил за да публикувате нова тема.

Разглеждащи това в момента 0

  • Няма регистрирани потребители разглеждащи тази страница.

Дарение

  • Подкрепи съществуването на форума - направи дарение
    32%
    Дарени 315 € от нужните 1 000 €

Бюлетин

Получавайте известие, когато има важна промяна или новина свързана с форума.

Профил

Навигация

Търсене

Търсене

Конфигуриране на push известия в браузъра

Chrome (Android)
  1. Докоснете иконата на катинар до адресната лента.
  2. Докоснете Разрешения → Известия.
  3. Променете предпочитанията си.
Chrome (Desktop)
  1. Кликнете върху иконата на катинар в адресната лента.
  2. Изберете Настройки на сайта.
  3. Намерете Известия и коригирайте предпочитанията си.