[ 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 | 148
Bydlisko: Bratislava
NapísalOffline : 19.10.2011 19:11 | Prepis konkretneho riadku v subore

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ý: 27.12.24
Príspevky: 1395
Témy: 10 | 10
Bydlisko: Hrinova
NapísalOffline : 20.10.2011 17:29 | Prepis konkretneho riadku v subore

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 | 96
Bydlisko: Bratislava,...
NapísalOffline : 20.10.2011 17:35 | Prepis konkretneho riadku v subore

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 | 148
Bydlisko: Bratislava
Napísal autor témyOffline : 21.10.2011 1:45 | Prepis konkretneho riadku v subore

@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ý: 27.12.24
Príspevky: 1395
Témy: 10 | 10
Bydlisko: Hrinova
NapísalOffline : 21.10.2011 11:24 | Prepis konkretneho riadku v subore

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 | 148
Bydlisko: Bratislava
Napísal autor témyOffline : 21.10.2011 12:51 | Prepis konkretneho riadku v subore

Ď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ý: 27.12.24
Príspevky: 1395
Témy: 10 | 10
Bydlisko: Hrinova
NapísalOffline : 21.10.2011 12:57 | Prepis konkretneho riadku v subore

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.
 [ Príspevkov: 7 ] 


Prepis konkretneho riadku v subore



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

472

10.11.2012 19:12

Denco1

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

Nefukcnost konkretneho webu

v Siete

3

263

14.11.2014 11:40

walther

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

Zaheslovanie konkretneho suboru

v PHP, ASP

3

1417

14.10.2009 14:18

pilná lama glama

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

Zhodnotenie konkrétneho tabletu

v Mobilné zariadenia

4

516

07.12.2013 17:04

energyxtc

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

Herné HTPC bez konkrétneho rozpočtu

v PC zostavy

19

1103

23.06.2016 12:36

Drako Ager

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

Vyber konkretneho textu z textarea

v PHP, ASP

3

513

29.08.2008 16:32

chrono

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

wordpress: ziskanie konkretneho post/page

v Redakčné systémy

2

385

20.09.2014 9:53

hatto13

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

mailový formulár - poslanie konkrétneho checkboxu

v PHP, ASP

4

808

30.04.2011 22:44

richo9996

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

Prepis vyslovnosti

v Krčma

16

1233

20.01.2012 9:34

marian_r

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

prepis suboru

v PHP, ASP

8

660

29.07.2008 1:11

BBUlet

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

Prepis domény

v Domény

7

1267

14.12.2009 17:37

Tominator

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

prepis suborou

v Technológia .NET

13

950

06.11.2010 19:17

p4tooo

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

Prepis adries ..

v Internetový marketing, SEO, reklama

2

1611

30.12.2008 17:11

kajbo

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

prepis kodu

v Redakčné systémy

6

668

19.01.2007 22:42

Tom@S

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

Wordpress - konkretny obsah pre konkretneho uzuvatela

v Redakčné systémy

7

633

12.11.2011 10:00

don jebot

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

514

17.08.2011 1:21

majso7



© 2005 - 2024 PCforum, edited by JanoF