Премини към съдържанието
От 1-ви септември 2021 г., вход във форумите ще е възможен само с имейл адрес вместо потребителско име. Ако не помните имейла с който сте се регистрирали, вижте го в настройките на профила си. ×
  • Добре дошли!

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

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

     

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


eXceLLen7

Препоръчан отговор


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

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

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

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

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

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

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

Линк към коментара
Сподели в други сайтове

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

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

и

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

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

и

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

Линк към коментара
Сподели в други сайтове

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

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

Линк към коментара
Сподели в други сайтове

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

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

заменете го с

while(!fp.eof())
{
}

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

 

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


Линк към коментара
Сподели в други сайтове

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

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

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

Линк към коментара
Сподели в други сайтове

Въпросче

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

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 Заетост: 
-------------------------------------------------------------------------------

 

 

Линк към коментара
Сподели в други сайтове

 

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

 

 

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

Линк към коментара
Сподели в други сайтове

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.

Линк към коментара
Сподели в други сайтове

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

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

1. main

прехвърля на

2. menu

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

3. enter

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

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

 

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

fp.write((char*)&pp, sizeof(person));
fp.close();
Линк към коментара
Сподели в други сайтове

 

...

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

 

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

Линк към коментара
Сподели в други сайтове

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

 

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

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

 

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

Линк към коментара
Сподели в други сайтове

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

 

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

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

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

Линк към коментара
Сподели в други сайтове

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

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

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

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

Линк към коментара
Сподели в други сайтове

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

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

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

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

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

 

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

Линк към коментара
Сподели в други сайтове

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

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

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

 

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

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

 

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

Линк към коментара
Сподели в други сайтове

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

Линк към коментара
Сподели в други сайтове

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

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

 

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

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

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

 

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

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

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

Линк към коментара
Сподели в други сайтове

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

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

Линк към коментара
Сподели в други сайтове

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

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

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

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

Линк към коментара
Сподели в други сайтове

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

Линк към коментара
Сподели в други сайтове

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

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

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

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

  • Подобни теми

    • от phoenix_x
      Здравейте, 
      обръщам се с помощ към форума и много ще се радвам ако проблемът мога да го разреша с ваша помощ. Ако не здраве да е.  Фотоапаратът е доста стар, но до сега правеше хубави снимки. Та проблемът е, че когато се правят снимки излизат линии/ ивици. Ако се снима със светкавица не си личат толкова, ако това е от значение. 
    • от силвия димитрова стефанова
      Здравейте! Може ли да ми помогнете с курсовата ми работа.  Това е условието. Не мога да направя точка 11‐III. Може ли да ми помогнете
      11‐I.Да се състави абстрактен клас Редактор на книга BookEditor Чисто виртуални функции:
      I.1.LIST<BOOKPAGE> GENERATEBOOK(STRING TITLE, INT NUMBERPAGES )‐ СЪЗДАВА СТРАНИЦИ ОТ КНИГА СЪС ЗАГЛАВИЕ TITLE И ПРАЗНИ СТРАНИЦИБРОЙ NUMBERPAGES И ГИ ДОБАВЯI.2.VOID SWAPPAGES(INT FIRSTPN, INT SECONDPN)‐ РАЗМЕНЯ СТРАНИЦИТЕ С НОМЕРА – ПАРАМЕТРИ FIRSTPN, SECONDPN.ПРОДУЦИРА ИЗКЛЮЧЕНИЕ, АКО НЕ МОЖЕ ДА СЕ ИЗПЪЛНИ
      11‐II.Да се състави клас Страница BookPage Скрити член променливи:
      Номер на страница‐ число int; Съдържание – низ string; Публични функции:
      II.1.КОНСТРУКТОРИ – ЕКСПЛИЦИТЕН, ПОДРАЗБИРАЩ СЕ;
      II.2.ЧЕТЕНЕ/ЗАПИС
      II.3.ЗА РАЗМЯНА НА СЪДЪРЖАНИЕ НА СТРАНИЦА С ПОДАДЕНАТА КАТО ПАРАМЕТЪР РЕФЕРЕНЦИЯ КЪМ СТРАНИЦА;
      II.4.OPERATOR == СРАВНЯВА ПО ВСИЧКИ ДАННИ
      II.5.OPERATOR< ЗА СРАВНЕНИЕ ЗА ПО‐МАЛКО НА ПОДАДЕНИЯ ПАРАМЕТЪР ОБЕКТ С ТЕКУЩИЯ ПО НОМЕР НА СТРАНИЦА
      II.6.ПРЕОБРАЗУВА / ВРЪЩА НИЗ ОТ ЧЛЕНОВЕТЕ НА КЛАСА
      II.7.OPERATOR<<(ИЗВЕЖДА В УКАЗАН ИЗХОДЕН ПОТОК)
      II.8.OPERATOR>>(ЧЕТЕ ОТ УКАЗАН ВХОДЕН ПОТОК)
      11‐III.Да се състави клас Книга Book за съхраняване на страници (подредени по номер на страница), наследник на BookEditor – клас I11‐I Скрити член променливи: Списък от страници – съдържа обекти от клас II, m_listPagesПублични функции: III.1.КОНСТРУКТОРИ – ЕКСПЛИЦИТЕН ПО БРОЙ СТРАНИЦИ И ЗАГЛАВНА СТРАНИЦА, СЪЗДАВА КНИГА СЪС ЗАГЛАВИЕ И ПРАЗНИ СТРАНИЦИ –УКАЗАНИЯ БРОЙ; ПОДРАЗБИРАЩ СЕ – СЪЗДАВА КНИГА САМО СЪС ЗАГЛАВИЕ
      III.2.ДОБАВЯНЕ НА СТРАНИЦА – ПАРАМЕТЪР СТРАНИЦА
      III.3.ПРОМЕНЯНЕ НА СТРАНИЦА – ПАРАМЕТЪР СТРАНИЦА
      III.4.ПРЕМАХВАНЕ НА СТРАНИЦА С ПОДАДЕН ПАРАМЕТЪР НОМЕР НА СТРАНИЦА
      III.5.РАЗМЕНЯНЕ НА СЪДЪРЖАНИЕ НА ПОДАДЕНИ ДВЕ РЕФЕРЕНЦИИ КЪМ СТРАНИЦИ.ПРОДУЦИРА ИЗКЛЮЧЕНИЕ, АКО НЕ МОЖЕ ДА СЕ ИЗПЪЛНИ
      III.6.ПРЕОБРАЗУВА / ВРЪЩА НИЗ ОТ ЧЛЕНОВЕТЕ НА КЛАСА
      III.7.ИМПЛЕМЕНТИРАНЕ НА ВИРТУАЛНИТЕ ФУНКЦИИ
      11‐IV.Главна функция (main) IV.1.СЪЗДАВА ОБЕКТ BOOK ОТ
      IIIIV.2.ИЗВЕЖДАНЕ НА КНИГАТА НА КОНЗОЛЕН ИЗХОД
      IV.3.ДОБАВЯНЕ НА СТРАНИЦА КЪМ
      IV.1, ИЗВЕЖДАНЕ НА РЕЗУЛТАТА НА КОНЗОЛЕН ИЗХОД
      IV.4.ПРЕМАХВАНЕ НА СТРАНИЦА ОТ
      IV.1, ИЗВЕЖДАНЕ НА РЕЗУЛТАТА НА КОНЗОЛЕН ИЗХОД
      IV.5.РАЗМЕНЯНЕ НА ДВЕ ОТ СТРАНИЦИТЕ ОТ
      IV.1, ИЗВЕЖДАНЕ НА РЕЗУЛТАТА НА КОНЗОЛЕН ИЗХОД
      IV.6.ОБРАБОТВАНЕ НА ИЗКЛЮЧЕНИЕ
    • от силвия димитрова стефанова
      Здравейте! Може ли да ми помогнете с точка II.6. Това е условието:
      Да се състави клас Страница BookPage Скрити член променливи: Номер на страница‐ число int; Съдържание – низ string; Публични функции: II.1.КОНСТРУКТОРИ – ЕКСПЛИЦИТЕН, ПОДРАЗБИРАЩ СЕ; II.2.ЧЕТЕНЕ/ЗАПИС II.3.ЗА РАЗМЯНА НА СЪДЪРЖАНИЕ НА СТРАНИЦА С ПОДАДЕНАТА КАТО ПАРАМЕТЪР РЕФЕРЕНЦИЯ КЪМ СТРАНИЦА; II.4.OPERATOR == СРАВНЯВА ПО ВСИЧКИ ДАННИ II.5.OPERATOR< ЗА СРАВНЕНИЕ ЗА ПО‐МАЛКО НА ПОДАДЕНИЯ ПАРАМЕТЪР ОБЕКТ С ТЕКУЩИЯ ПО НОМЕР НА СТРАНИЦА II.6.ПРЕОБРАЗУВА / ВРЪЩА НИЗ ОТ ЧЛЕНОВЕТЕ НА КЛАСА II.7.OPERATOR<<(ИЗВЕЖДА В УКАЗАН ИЗХОДЕН ПОТОК) II.8.OPERATOR>>(ЧЕТЕ ОТ УКАЗАН ВХОДЕН ПОТОК) Направила съм това:
      class BookPage { private: int NumberPage; //номер на страница string Contents; //съдържание public: BookPage(int numberPage, string contents) { NumberPage = numberPage; Contents = contents; } BookPage() { NumberPage = 0; Contents = " "; } const int& getNumberPage()const { return NumberPage; } const string& getContents()const { return Contents; } void setNumberPage(const int& sNumPege) { NumberPage = sNumPege; } void setContents(const string& sContents) { Contents = sContents; } bool operator == (const BookPage& book)const { return this->NumberPage == book.NumberPage, this->Contents == book.Contents; } bool operator < (const BookPage& number) { return this->NumberPage < number.NumberPage; } friend ostream& operator <<(ostream& out, const BookPage& book) { out << book.NumberPage << " " << book.Contents; return out; } friend ifstream& operator >> (ostream& in, BookPage& book) { cin >> book.NumberPage >> book.Contents; return in; } };  
    • от силвия димитрова стефанова
      Здравейте! Може ли да ми помогнете дали това е правилно направено.
      BookEditor::BookEditore() { BookPage::BookPage(); GenerateBook = 0; NumberPages = ""; } ListGenerateBook(string ownerBook, int 278 pages) { GenerateBook(adress); GenerateBook::ownerBook; BookPage::278 pages BookPage = Bookwords; BookEditor = getArea; } void swapPages(int86, int second 45) { BookPage::setAdress(obj.GenerateBook::getAdress()); BookPage::setArea(obj.GenerateBook::getArea()); BookPage::setHeight(obj.GenerateBook::getHeight()); BookPage = obj.BookPage; m_strOwner = obj.m_strOwner; }  

    • от ZTT7
      Здравейте. Имам проблем с качването на един клип в канала си, който изтеглих от мрежата и на който поставих субтитри, но има фонова музика, която се оказва е с лиценз, поради което ми дава, че има иск за нарушаване на авторски права. Канала от който изтеглих клипа е решил този проблем, като под видеото, неизвестно за мен как, е упоменал - Коя е песента, Кой е изпълнителя, Кой е албума, Кой е автора и най вече, че Лиценза е в полза на YouTube от някакви там компании и 9 сдружения за музикални права. При качването на видеото не открих възможност някъде това да упомена и аз, за да не бъда в нарушение! Изгледах няколко видеа на youtube в които уж обясняват кое - как е, и що е, но за това не чух и дума. Има ли някой който да е в час с тези лицензи и да знае как стават нещата? Ще бъда много благодарен!
  • Дарение

×
×
  • Добави ново...

Информация

Поставихме бисквитки на устройството ви за най-добро потребителско изживяване. Можете да промените настройките си за бисквитки, или в противен случай приемаме, че сте съгласни с нашите Условия за ползване