IT NEWS PC REVUE PC FORUM FreeBSDInternet time: @713
Obsah fóra
Pravidlá  •  Kontakt  •  Prihlásenie  •  Registrácia

Pre ľahší život

Pozrite sa, ako sa dostať do zdravšej a ľahšej telesnej hmotnosti. www.janinblog.com

Každé ráno jablko.

A tri ďalšie veľmi jednoduché tipy pre rýchle a zdravé chudnutie bez diét! www.news2channel.net

Priprav sa na futbalové EURO

Exkluzívna súťaž o Ford Fiesta! Kurzová superponuka a bonus 100€ https://www.tipsport.sk

Zhoď nadbytočné kilogramy

Rýchlo. Jednoducho. Trvalo. Za pomoci naturálnych produktov! www.janinblog.com

Kedy sa oplatí prerobiť auto

na plyn? Nemusíte nevyhnutne hľadať kalkulačku a papier, aby ste si autoviny.zoznam.sk

C linearne viazany zoznam

Zaslať odpoveď
AutorSpráva
xyzz
Užívateľ
Užívateľ

Založený: 15.10.2011
Príspevky: 13

PríspevokZaslal: Ne 11.12.11 18:20Odpovedať s citátomNávrat hore

Nemozem prist na to, preco mi to preskoci nacitanie druheho a stvrteho prvku
kód:

 int i = 0;
   
typedef struct prvok {
  int hodnota;
  struct prvok *dalsi;
} TPrvok;

TPrvok *z, *k, *p;

void pridaj(TPrvok **z, TPrvok **k)
{
  TPrvok *p;
  if (*z == NULL)
  {
    printf("ahoj\n");
    *z = (TPrvok*)malloc(sizeof(TPrvok));
    (*z)->hodnota = getchar();
    (*z)->dalsi = NULL;
    *k = *z;
  }
  else
  {
    printf("cau\n");
    p = (TPrvok*)malloc(sizeof(TPrvok));
    p->hodnota = getchar();
    p->dalsi = NULL;
    (*k)->dalsi = p;
    *k = p;
  }
}

void vypis(TPrvok *p)
{
  while (p != NULL)
  {
    printf("prvok : %c\n", p->hodnota);
    p = p->dalsi;
  }
}

int main()
{
  z = k = NULL;
  for (int i = 0; i < 5; i++) pridaj (&z, &k);
  vypis(z);
  return EXIT_SUCCESS;
}
Zobraziť informácie o autoroviOdoslať súkromnú správu
Fico
Skúsený užívateľ
Skúsený užívateľ

Založený: 11.01.2009
Príspevky: 1049

PríspevokZaslal: Ne 11.12.11 21:22Odpovedať s citátomNávrat hore

Pretoze po volani getchar() ti ostane vo vstupnom buffri stdin znak enter. Zadas znak a stlacis enter. Ten enter sa vrati pri dalsom volani getchar a ulozi sa vlastne do dalsieho zaznamu. Zadas napr toto:
kód:
a [enter]
b [ enter]
c [enter]
.......
prvy prvok = a
druhy prvok = [enter]
treti prvok = b
stvrty prvok = [enter]
piaty prvok = c


Aby si to obisla, tak potrebujes vyprazdnit vstupny buffer po kazom volani getchar(). Mozes si do kodu pridat nasledujucu funkciu:
kód:
void flush_stdin()
{

    int c;
    while ( ( c = getchar() ) != '\n' && c != EOF );

}


A vo svojom kode iba pridaj jej volanie:
kód:
void pridaj(TPrvok **z, TPrvok **k)
{
  TPrvok *p;
  if (*z == NULL)
  {
    printf("ahoj\n");
    *z = (TPrvok*)malloc(sizeof(TPrvok));
    (*z)->hodnota = getchar();
    flush_stdin();        /* tuna vloz volanie funkcie */
    (*z)->dalsi = NULL;
    *k = *z;
  }
  else
  {
    printf("cau\n");
    p = (TPrvok*)malloc(sizeof(TPrvok));
    p->hodnota = getchar();
    flush_stdin();        /* tuna vloz volanie funkcie */
    p->dalsi = NULL;
    (*k)->dalsi = p;
    *k = p;
  }
}
Zobraziť informácie o autoroviOdoslať súkromnú správuICQ
xyzz
Užívateľ
Užívateľ

Založený: 15.10.2011
Príspevky: 13

PríspevokZaslal: Ne 11.12.11 22:39Odpovedať s citátomNávrat hore

Dakujem opat... Mam tu dalsiu vec, ja proste nie som schopna tie problemy vyriesit... Tu uz mam nacitavanie cez terminal a vypis do suboru, tak to funguje. Lenze tie slova by sa nemali zadavat do terminalu, ale precitat zo suboru...
kód:

typedef struct {
  wchar_t slovo[30];
} tdata;

typedef struct item titem;

struct item {
  tdata data;
  titem *next;
};

typedef struct {
  titem *head;
  titem *tail;
} tlist;

void listInit(tlist *list)
{
  list->head = NULL;
  list->tail = NULL;
  return;
}

int read(tdata *slovo, char *argv[])
{
  FILE *f;
  f = fopen(argv[1], "r");
 
  if (f == NULL)
  { return EXIT_FAILURE; }
  // nacitavanie cez terminal, ale takto : int i = fwscanf(f, L"%ls", slovo->slovo); to nefunguje :(
  int i = wscanf(L"%ls", slovo->slovo);
 
  if (i != 1 && i != EOF)
    return EXIT_FAILURE;
  return i;
}

void insertFirst(tlist *list, tdata d)
{
  titem *newItem;
  if ((newItem = malloc(sizeof(titem))) == NULL)
    return EXIT_FAILURE;
  newItem->data = d;
  newItem->next = list->head;
  list->head = newItem;
  return;
}

void readList(tlist *list, char *argv[])
{
  tdata tmp;
  while (read(&tmp, argv) != EOF)
    insertFirst(list, tmp);
  return;
}

int writeList (const tlist *list, char *argv[])
{
  FILE *f2;
  f2 = fopen(argv[2], "w");
  if (f2 == NULL)
    return EXIT_FAILURE;
 
  for (titem *tmp = list->head; tmp != NULL; tmp = tmp->next)
    fwprintf(f2, L"%ls\n", tmp->data.slovo);
  return EXIT_SUCCESS;
}

int main(int argc, char *argv[])
{
  setlocale(LC_CTYPE, NULL);
  tlist list;
  listInit (&list);
  readList(&list, argv);
  writeList(&list, argv);
  return EXIT_SUCCESS;
}
Zobraziť informácie o autoroviOdoslať súkromnú správu
Fico
Skúsený užívateľ
Skúsený užívateľ

Založený: 11.01.2009
Príspevky: 1049

PríspevokZaslal: Ne 11.12.11 23:39Odpovedať s citátomNávrat hore

1. chyba:
kód:
f = fopen(argv[1], "r");

zmenit na:
kód:
f = fopen(argv[1], "rb");


2. chyba:
Vo funkcii read je hned na zaciatku toto:
kód:
  FILE *f;
  f = fopen(argv[1], "r");

Tzn, kazdy vstup sa subor nanovo otvori a zabudne sa pozicia, kde sa citat dalej. Je nutne umiestnit toto otverenie suboru mimo funkciu. Nebudem ti vraviet kde, kedze celu funkciu si tomu prisposobovala, skus sa s tym pohrat, kde umiestnit otvaranie, aby to vyhovovalo tvojmu kodu. Len davaj pozor, aby to nebolo v slucke, ako teraz ( lebo cela funkcia sa nachadza v slucke while ).

3. chyba:
Este stale vo funkcii read, zmen tento riadok ( EXIT_FAILURE je definovana ako 1, nie 0, na to pozor ):
kód:
if (i != 1 && i != EOF)
  return EXIT_FAILURE;

na:
kód:
if (i != 1 || i == EOF)
  return 0;


4. chyba:
Ta sa sice nemusi nijako prejavit, ale neuzatvaras otvorene subory funkciou fclose. Po kazdej skoncenej praci so subormi by sa mali korektne zatvorit. Ak sa to nespravi, tak potom pri nasledovnej praci sa program moze spravat divoko.



// EDIT

A este som zabudol, kedze v tretej chybe som ti zmenil navratovu hodnotu, tak potom este uprav cyklus vo funkcii readList:
kód:
while (read(&tmp, argv) != EOF)

na:
kód:
while (read(&tmp, argv) != 0 )
Zobraziť informácie o autoroviOdoslať súkromnú správuICQ
xyzz
Užívateľ
Užívateľ

Založený: 15.10.2011
Príspevky: 13

PríspevokZaslal: Po 12.12.11 0:18Odpovedať s citátomNávrat hore

To otvaranie suboru bol problem... To je taka hlupost, ale samej mi to nedojde, az potom ze no jasneeee... Dakujem, som tvojim vecnym dlznikom. Urcite sa tu este ozvem s niecim dalsim
Zobraziť informácie o autoroviOdoslať súkromnú správu
Zobraziť príspevky z predchádzajúcich:    
Zaslať odpoveď
Nemôžete pridávať nové témy do tohto fóra.
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.
Nemôžete hlasovať v tomto fóre.

Powered by phpBB 2.x.x © 2005 - 2012 PCforum, webhosting by WebSupport, edited by JanoF

SEO - optimalizácia pre vyhľadávače

Freebsd