Využij akce až 30 % zdarma při nákupu e-learningu. Více informací. Zároveň je tento týden sleva až 80 % na e-learning týkající se C# .NET
Hledáme nového kolegu do redakce - 100% home office, 100% flexibilní pracovní doba. Více informací.
Avatar
Jozef Vendel
Člen
Avatar
Jozef Vendel:18. března 14:50

Caute, snazim sa napisat kod v jazyku C, ktory bude citat zo suboru (v subore je ulozene meno a za nim vek na jednom riadku a potom pokracuju riadky v tomto style) meno a vek osoby a ulozi to do statickeho pola struktur. Problem mam stym, ze ak chcem vypisat, neskor nejaku osobu zo struktury tak mi vypisse len poslednu a to len na 0 indexe. K ostatnym neviem pristupit. Viete mi poradit, kde robim chybu ?

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#define MAX 81
#define COUNT 1000

typedef struct {
  char name[MAX];
  int old;
} PERSON;


int main(void){


  FILE *fr;
  PERSON array[COUNT];
  char file[MAX];
  int i;

  printf("Enter the name file\n");
  scanf(" %[^\n]s", file);

  if ((fr = fopen(file, "r")) == NULL){
    printf("Couldn't the open  %s file\n", file);
    exit(1);
  }


  int o, t, j = 0;
  int lok = 0;

  for (o = 0; o < COUNT; o++){
  while (fscanf(fr, "%s %d", array[o].name, &array[o].old) != EOF){
  printf("%s %d\n", array[o].name, array[o].old);
    j++;
    }
  }

  printf("Printout the first person and age: %s %d\n", array[0].name, array[0].old);
/*
  for (t = 0; t < j; t++){
  lok += pole[o].stari;
  }
*/
/*
  printf("Pocet precitanych cisel bol: %d\n", j);
  printf("Sucet precitanych cisel bol: %d\n", lok);
 */

  if ((fclose(fr)) == EOF){
    printf("Couldn't the close file\n");
  }


  return 0;
}

Zkusil jsem: Co som skusal som spomenul uz.

Chci docílit: Co sa snazim dosiahnut som tiez spomenul.

 
Odpovědět
18. března 14:50
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Jozef Vendel
DarkCoder:18. března 15:37

Chybně je proces naplňování pole struktur daty ze souboru.

for (o = 0; o < COUNT; o++){
  while (fscanf(fr, "%s %d", array[o].name, &array[o].old) != EOF){
  printf("%s %d\n", array[o].name, array[o].old);
    j++;
    }
  }

Chyba je v použití dvou cyklů. Cyklus while už sám o sobě provede traversování dát celého souboru. Přepisuješ dokola hodnotu na nulovém indexu, neboť ve while cyklu nezvyšuješ indexovou proměnnou. For cyklus se provádí zbytečně, neboť už všechna data ze souboru byla načtena pomocí while cyklu.

Použij buď samotný for cyklus nebo samotný while cyklus. Mnohem lepší je while cyklus, neboť nevíš, kolik záznamů se nachází v souboru.

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět
18. března 15:37
"„Učíš-li se proto, aby sis zapamatoval, zapomeneš. Učíš-li se proto, abys porozuměl, zapamatuješ si."
Avatar
Jozef Vendel
Člen
Avatar
Odpovídá na DarkCoder
Jozef Vendel:18. března 15:49

Presne, uz rozumiem.
Som si to neuvedomil, myslienka bola aby to robilo nieco ine.
Dakujem

 
Nahoru Odpovědět
18. března 15:49
Avatar
Jozef Vendel
Člen
Avatar
Odpovídá na DarkCoder
Jozef Vendel:18. března 16:51

Nakoniec som to takto urobil ze som vytvoril funkiu napln, ktora mi naplnila strukturu a pouzival uz len while, kde som ukladal docasne do parametrov a potom som z tymi parametrami volal funkciu.

void napln(PERSON *person, char *name1, int old1){
  person->old = old1;
  strcpy(person->name, name1);
}
while (fscanf(fr, "%s %d", do_name, &do_old) != EOF){
    napln(&array[j++], do_name, do_old);
  }
 
Nahoru Odpovědět
18. března 16:51
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Jozef Vendel
DarkCoder:18. března 18:06

Z hlediska způsobu programování v C to lze udělat lépe. Celý proces načtení dat ze souboru do pole struktur probíhá pouze mezi daným souborem a polem. Bylo by škoda jej nějakým způsobem oddělovat. Celé to lze napsat jako jednu funkci, která bude mít tři parametry - ukazatel na soubor, ukazatel na pole struktur, velikost struktury. Výsledkem celého tohoto snažení je prosté volání funkce. Cyklus while je součástí této funkce. Prototyp této funkce bude následovný:

int load_file_to_struct(FILE *pf, PERSON *pPerson, int size);

Návratová hodnota může indikovat, zda načtení proběhlo správně či nikoliv.

Nahoru Odpovědět
18. března 18:06
"„Učíš-li se proto, aby sis zapamatoval, zapomeneš. Učíš-li se proto, abys porozuměl, zapamatuješ si."
Avatar
Jozef Vendel
Člen
Avatar
Odpovídá na DarkCoder
Jozef Vendel:20. března 19:51

Dobre dakujem za upozornenie.

 
Nahoru Odpovědět
20. března 19:51
Avatar
Jozef Vendel
Člen
Avatar
Jozef Vendel:20. března 19:54

Inac, vidim, ze si v jazyku C ako doma a ja som este len zaciatocnik a snazim sa tento sietovy protokol Salt-channel nasadit v systeme Windows ale velmi sa mi nedari, ak by si mal cas a zaujem, nechcel by si mi pomoct ?

 
Nahoru Odpovědět
20. března 19:54
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 7 zpráv z 7.