IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Praca so strukturou a suborom v jazyku C

V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Jozef Vendel
Člen
Avatar
Jozef Vendel:18.3.2021 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.3.2021 14:50
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Jozef Vendel
DarkCoder:18.3.2021 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í
+2,50 Kč
Řešení problému
Nahoru Odpovědět
18.3.2021 15:37
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Jozef Vendel
Člen
Avatar
Odpovídá na DarkCoder
Jozef Vendel:18.3.2021 15:49

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

 
Nahoru Odpovědět
18.3.2021 15:49
Avatar
Jozef Vendel
Člen
Avatar
Odpovídá na DarkCoder
Jozef Vendel:18.3.2021 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.3.2021 16:51
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Jozef Vendel
DarkCoder:18.3.2021 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.3.2021 18:06
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Jozef Vendel
Člen
Avatar
Odpovídá na DarkCoder
Jozef Vendel:20.3.2021 19:51

Dobre dakujem za upozornenie.

 
Nahoru Odpovědět
20.3.2021 19:51
Avatar
Jozef Vendel
Člen
Avatar
Jozef Vendel:20.3.2021 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.3.2021 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.