| Autor | Správa |
xyzz
 Užívateľ
 Založený: 15.10.2011 Príspevky: 13
 | Zaslal: Ne 11.12.11 18:20 |   |
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;
} |
|
| |
  |
 |
Fico
 Skúsený užívateľ
 Založený: 11.01.2009 Príspevky: 1049
 | Zaslal: Ne 11.12.11 21:22 |   |
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;
}
} |
|
| |
   |
 |
xyzz
 Užívateľ
 Založený: 15.10.2011 Príspevky: 13
 | Zaslal: Ne 11.12.11 22:39 |   |
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;
} |
|
| |
  |
 |
Fico
 Skúsený užívateľ
 Založený: 11.01.2009 Príspevky: 1049
 | Zaslal: Ne 11.12.11 23:39 |   |
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 ) |
|
| |
   |
 |
xyzz
 Užívateľ
 Založený: 15.10.2011 Príspevky: 13
 |
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  |
| |
  |
 |
|
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.
|
|