Obsah fóra
PravidláRegistrovaťPrihlásenie




Odpovedať na tému [ Príspevkov: 7 ] 
AutorSpráva
Offline

Užívateľ
Užívateľ
Prepis konkretneho riadku v subore

Registrovaný: 05.10.06
Prihlásený: 15.10.18
Príspevky: 1891
Témy: 148
Bydlisko: Bratislava
Príspevok NapísalOffline : 19.10.2011 19:11

Ahojte. Po php som sa dal na C a som z toho zatiaľ trochu vedľa. Najviac mi chýbajú databázy resp mysql a tak údaje ukladám do txt. Mám takúto úlohu: simulovať bankomat. To znamená, že užívateľ zadá meno, heslo a dostane sa do opakujúceho sa menu s možnosťami Výber, Vklad, Výpis stavu účtu a exit. Môže vybrať a vložiť peniaze čo samozrejme zmení stav účtu. Mená, heslá a stavy účtov mám uložené v txt súbore v tvare meno heslo stav_účtu
Kód:
peter 0000 100
jano 1111 500
fero 2222 10000


Potiaľto všetko funguje. Problém je, že po výbere a vložení na účet neviem zmeniť stav účtu v txt súbore. V nasledujúcom zdrojáku som zakomentoval 2 riadky, v ktorých by malo prebiehať updatovanie txt súboru.

Ďakujem za rady :)

Kód:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int menu_volba;

void menu()
{
   printf("\n/* MENU */\n1 Vklad\n2 Vyber\n3 Vypis uctu\n4 Ukoncit program\n\nStlacte cislo pre vyber operacie: ");
   scanf("%d", &menu_volba);

   if (system("cls")) system("clear");
}

int vklad(int pom, int ciastka)
{
   pom += ciastka;
   printf("Suma %d bola vlozena na ucet\n\n", ciastka);

   return pom;
}

int vyber(int pom, int ciastka)
{
   pom -= ciastka;
   printf("Suma %d bola vybrana z uctu\n\n", ciastka);   

   return pom;
}

int main(void)
{
   int hodnota, najdene = 0, stav_uctu;
   char meno[10], meno_compare[10], heslo[4], heslo_compare[4], riadok[30];
   FILE *fr, *fw;

   fr = fopen("bankove_ucty.txt", "r");

   printf("Prihlasovacie meno (malymi pismenami): ");
   scanf("%s", meno);

   while( (fgets(riadok, 30, fr)) != NULL)
   {
      riadok[strlen(riadok) - 1] = '\0';

      sscanf(riadok, "%s %s %d", meno_compare, heslo_compare, &stav_uctu);
      
      if ( strcmp(meno, meno_compare) == 0  )
      {
         najdene = 1;
         break;
      }

      memset(&riadok[0], 0, sizeof(riadok));
      memset(&meno_compare[0], 0, sizeof(meno_compare));
      memset(&heslo_compare[0], 0, sizeof(heslo_compare));
   }

   fclose(fr);

   if ( !najdene )
   {
      printf("\nZle prihlasovacie meno\n");
      return 1;
   }

   printf("\nZadajte prihlasovacie heslo: ");
   scanf("%s", heslo);
   
   if ( strcmp(heslo, heslo_compare) != 0 )
   {
      printf("Zle heslo");
      return 1;
   }

   menu();

   while (menu_volba != 4)
   {
      if (menu_volba == 1)
      {
         printf("Zadajte vkladanu sumu: ");
         scanf("%d", &hodnota);

         stav_uctu = vklad(stav_uctu, hodnota);

         fw = fopen("bankove_ucty.txt", "w");
         // Tu potrebujem prepisat stav_uctu uzivatela ktory je prihlaseny na novy stav_uctu
         fclose(fw);
      }
      else if (menu_volba == 2)
      {
         printf("Zadajte vyberanu sumu: ");
         scanf("%d", &hodnota);

         stav_uctu = vyber(stav_uctu, hodnota);

         fw = fopen("bankove_ucty.txt", "w");
         // Tu potrebujem prepisat stav_uctu uzivatela ktory je prihlaseny na novy stav_uctu
         fclose(fw);
      }
      else if (menu_volba == 3)
      {
         printf("Stav uctu: %d\n\n", stav_uctu);
      }

      menu();
   }

   return 0;
}







_________________
Notebook Dell 7537, 24" BenQ BL2411PT, Logitech Illuminated keyboard, Razer DeathAdder, Razer Goliathus, Koss Porta Pro
Offline

Skúsený užívateľ
Skúsený užívateľ
Prepis konkretneho riadku v subore

Registrovaný: 11.01.09
Prihlásený: 26.04.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOffline : 20.10.2011 17:29

Kamahl píše:
Najviac mi chýbajú databázy resp mysql

Pre jazyk C existuju kniznice na pracu s mysql, ale blizsie info ti nedam, nakolko som s tym nikdy nerobil. K tvojmu problemu: Ak chces menit nejake data v subore, potrebujes ich mat nejako logicky potriedene, aby si k nim mohol nejake pristupovat. Najlepsie bude, ak si vytvoris nejaku strukturu a do suboru budes len zapisovat a citat tieto struktury. Tak sa dokazes lahko dostat k jednotlivym polozkam a nasledne ich prepisat. Mala ukazka:

Strutktura
Kód:
typedef struct {
    char meno[30];
    char heslo[8];
    char stavUctu[10];
} Database;


Priradenie hodnot permennym v strukture
Kód:
    Database d;
    FILE *f;

    strcpy( d.meno, "peter" );
    strcpy( d.heslo, "0000" );
    strcpy( d.stavUctu, "100" );


Zapis do suboru
Kód:
    f = fopen( "database.txt", "w" );
    fwrite( (void*) &d, sizeof( Database ), 1, f );
    fclose( f );


Citanie zo suboru
Kód:
    f = fopen( "database.txt", "r" );
    fread( (void*) &d, sizeof( Database ), 1, f );


Offline

Užívateľ
Užívateľ
Prepis konkretneho riadku v subore

Registrovaný: 27.12.08
Prihlásený: 13.12.22
Príspevky: 1874
Témy: 96
Bydlisko: Bratislava,...
Príspevok NapísalOffline : 20.10.2011 17:35

napadajú ma hneď 3 spôsoby ako toto riešiť, možno tvoja predstava je úplne iná...

1. pri prepisovaní si vytvor nový súbor, do ktorého budeš riadok po riadku prepisovať súbory zo starého súboru, až kým sa nedostaneš na ten riadok, ktorý chceš upraviť, upravíš ho a ďalej prepisuješ riadok po riadku, následne starý súbor zmažeš (prípadne zálohuješ) a nový premenuješ..

2. maj celú dobu celú databázu v pamäti programu a ukladaj ju po každej transakcii ako zálohu...

3. urob si viacero súborov.. pre každého klienta jeden, s jeho menom, tým pádom sa zbavíš všetkých problémov (kratšia prístupová doba, lebo pristupuješ priamo ku klientovmu súboru a nemusíš ho hľadať v jednom veľkom súbore, menej práce pri prepisovaní, menej miesta zabratého zálohami (pokiaľ zálohuješ, nemusíš do zálohy ukladať aj to, čo sa od poslednej zálohy nezmenilo)







_________________
~Listen to your brain, not your heart~
NB1: Lenovo Y500: CPU: Intel Core i7-3630QM; GPU: nVidia GT650M 2GB SLi; RAM: 16GB DDR3; HDD: 1TB + 256GB SSD (m4); LCD: 15,6" 1920x1080; OS: Win8.1 64-bit + Arch Linux 64-bit (UEFI Powered DualBoot)
NB2: Asus K53SJ-SX093: CPU: Intel Core i3-2310M; GPU: Intel HD3000 / nVidia GT520M 1GB Optimus; RAM: 8GB DDR3; SSD: 128GB 840Evo; LCD: 15,6" 1366x768; OS: Win 8.1 Pro 64-bit (UEFI)
Offline

Užívateľ
Užívateľ
Prepis konkretneho riadku v subore

Registrovaný: 05.10.06
Prihlásený: 15.10.18
Príspevky: 1891
Témy: 148
Bydlisko: Bratislava
Príspevok Napísal autor témyOffline : 21.10.2011 1:45

@Fico: ďakujem za odpoveď. O štruktúrach som v Heroutovi už čítal takže použitie ovládam. Nepochopil som ale ten zápis a čítanie. Kde tam určujem ktorý riadok sa má prepísať?







_________________
Notebook Dell 7537, 24" BenQ BL2411PT, Logitech Illuminated keyboard, Razer DeathAdder, Razer Goliathus, Koss Porta Pro
Offline

Skúsený užívateľ
Skúsený užívateľ
Prepis konkretneho riadku v subore

Registrovaný: 11.01.09
Prihlásený: 26.04.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOffline : 21.10.2011 11:24

Zapis je prosty - kazdy novy zaznam sa zapise na koniec suboru ( fopen s parametrom "a" ). A citanie mozes realizovat v cykle takto:

Kód:
    f = fopen( "database.txt", "r+" );
    while ( fread( (void*) &d, sizeof( Database ), 1, f ) == 1 )

        if ( strcmp( d.meno, "peter" ) == 0 ) {                         // meno, ktore hladame
            strcpy( d.stavUctu, "1000" );                               // novy stav uctu
            fseek( f, ftell( f ) - sizeof( Database ), SEEK_SET );      // seekneme sa v subore o jeden zaznam spat, aby sme ho prepisali
            fwrite( (void*) &d, sizeof( Database ), 1, f );         // a prepiseme povodne udaje v subore
        }

    fclose( f );


Offline

Užívateľ
Užívateľ
Prepis konkretneho riadku v subore

Registrovaný: 05.10.06
Prihlásený: 15.10.18
Príspevky: 1891
Témy: 148
Bydlisko: Bratislava
Príspevok Napísal autor témyOffline : 21.10.2011 12:51

Ďakujem. A ako odmažem riadok so starým stavom účtu ? :) Ak by som len pridával na koniec, tak tam mám veľa záznamov pre 1 užívateľa







_________________
Notebook Dell 7537, 24" BenQ BL2411PT, Logitech Illuminated keyboard, Razer DeathAdder, Razer Goliathus, Koss Porta Pro
Offline

Skúsený užívateľ
Skúsený užívateľ
Prepis konkretneho riadku v subore

Registrovaný: 11.01.09
Prihlásený: 26.04.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOffline : 21.10.2011 12:57

Ono to pridavanie mozes tiez spravit tak, ze najprv prehladas cely subor a ak uz existuje zaznam pre dane meno, tak ho iba prepises, ako v tom mojom poslednom poste. A ak sa nenachadza, tak ho zapises na koniec. Je to opat o nieco jednoduchsie. Ak by si predsa len chcel zmazat nejaky zaznam v strede suboru, tak najskor asi podobnym stylom, ako opisal nBXXL v prvom bode.







_________________
Ak potrebujete pomoc s diagnostikou/opravou vasej elektroniky ( notebook, motherboard, GPU, a ine ), kontaktujte ma cez SS.
Odpovedať na tému [ Príspevkov: 7 ] 


Podobné témy

 Témy  Odpovede  Zobrazenia  Posledný príspevok 
V tomto fóre nie sú ďalšie neprečítané témy. Čítanie premennej určitého na určitom riadku v txt súbore

v Assembler, C, C++, Pascal, Java

2

431

10.11.2012 19:12

Denco1 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Nefukcnost konkretneho webu

v Siete

3

216

14.11.2014 11:40

walther Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Zaheslovanie konkretneho suboru

v PHP, ASP

3

1366

14.10.2009 14:18

pilná lama glama Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Zhodnotenie konkrétneho tabletu

v Mobilné zariadenia

4

456

07.12.2013 17:04

energyxtc Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Herné HTPC bez konkrétneho rozpočtu

v PC zostavy

19

1038

23.06.2016 12:36

Drako Ager Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Vyber konkretneho textu z textarea

v PHP, ASP

3

467

29.08.2008 16:32

chrono Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. wordpress: ziskanie konkretneho post/page

v Redakčné systémy

2

355

20.09.2014 9:53

hatto13 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. mailový formulár - poslanie konkrétneho checkboxu

v PHP, ASP

4

761

30.04.2011 22:44

richo9996 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Prepis vyslovnosti

v Krčma

16

1175

20.01.2012 9:34

marian_r Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. prepis suboru

v PHP, ASP

8

615

29.07.2008 1:11

BBUlet Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Prepis domény

v Domény

7

1222

14.12.2009 17:37

Tominator Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. prepis suborou

v Technológia .NET

13

911

06.11.2010 19:17

p4tooo Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Prepis adries ..

v Internetový marketing, SEO, reklama

2

1443

30.12.2008 17:11

kajbo Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. prepis kodu

v Redakčné systémy

6

616

19.01.2007 22:42

Tom@S Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Wordpress - konkretny obsah pre konkretneho uzuvatela

v Redakčné systémy

7

590

12.11.2011 10:00

don jebot Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Vyber LCD monitora z konkretneho shopu

v Monitory, televízory a projektory

0

485

17.08.2011 1:21

majso7 Zobrazenie posledných príspevkov


Nemôžete zakladať nové témy v tomto fóre
Nemôžete odpovedať na témy v tomto fóre
Nemôžete upravovať svoje príspevky v tomto fóre
Nemôžete mazať svoje príspevky v tomto fóre

Skočiť na:  

Powered by phpBB Jarvis © 2005 - 2024 PCforum, webhosting by WebSupport, secured by GeoTrust, edited by JanoF
Ako väčšina webových stránok aj my používame cookies. Zotrvaním na webovej stránke súhlasíte, že ich môžeme používať.
Všeobecné podmienky, spracovanie osobných údajov a pravidlá fóra