Program sorujacy Strukturą + alokacja pamięci

0

Cześć, mam problem , jestem początkujący a dostałem do napisania program, który ma sortować listę osób(nieznana ilość) z pliku tekstowego (w formacie: Imię Nazwisko PESEL) , posortowana listę(według wybranego kryterium Imie lub Nazwisko lub PESEL) zapisywać w nowym pliku. Do tego ma używać malloca. Rozumiem że muszę stworzyć strukturę osoby, napisać funkcje sortującą(tutaj mam narzucone przez wstawianie ) ale nie wiem jak stworzyć strukture która będzie tworzona dla n osób oraz jak wczytać te dane z pliku. Prosze o wskazówki lub podobne kody źródłowe które może mi coś rozjaśnią :/ . Przepraszam za kłopot i zawracanie głowy

z góry dzięki :)

#include <string.h>
#include <stdio.h>
#include <stdlib.h>

struct dane {
	char* imie[40];
	char* nazwisko[40];
	int PESEL;
};

int main(){
    int i;
    char cbuf[512];
    FILE *dane;

    dane = fopen("/Users/Adam/Desktop/dane.txt","r");

struct dane D;
printf("Imie: \n"); fscanf(dane,"%s",&D.imie) /*scanf("%s",D.imie)*/;
printf("Nazwisko:\n "); fscanf(dane,"%s",&D.nazwisko)  /*scanf("%s",D.nazwisko)*/;
printf("PESEL: \n"); fscanf(dane,"%s",&D.PESEL) /*scanf("%d",&D.PESEL)*/;
printf("%s %s, PESEL: %d\n",D.imie,D.nazwisko,D.PESEL);
return 0;

	/*int  tab_dlugosc, i, j, temp;
	char cbuf[1024];
    FILE *dane;
    dane = fopen("/Users/Adam/Desktop/dane.txt","r");

	if(fgets(cbuf, sizeof(cbuf), dane)!=NULL);
	printf( "\nPodano: %s", cbuf);*/


} 
1

tablica struktur

0

napisz albo skorzystaj z gotowej implementacji linked/array listy

0

tak ma wyglądać tablica struktur ? mam pytanie jaki dać warunek zakończenia pętli for ? a co do array to mógłbyś w kilku słowach wytłumaczyć ?

 
struct dane {
	char* imie[40];
	char* nazwisko[40];
	int PESEL;
};

int main(){
    int i;
    FILE *dane;

    dane = fopen("/Users/Adam/Desktop/dane.txt","r");

struct dane osoby[]=
{

for(i=0;;i++){
    fscanf(dane,"%s",&osoby[i].imie) ;
    fscanf(dane,"%s",&osoby[i].nazwisko) ;
    fscanf(dane,"%s",&osoby[i].PESEL);
    printf("%s %s, PESEL: %d\n",osoby[i].imie,osoby[i].nazwisko,osoby[i].PESEL);
    }
};
return 0;


}
0
char* imie[40];

To tablica 40 wskaźników na char, a chcesz 40 charów.

0

czyli powinno być

 
char imie[40];
char nazwisko[40];
int PESEL;
3

Nie wydaje mi się, żeby numer PESEL zmieścił się w int. Użyj uint64_t, bo nie można mieć pewności, że unsigned long int będzie mieć 64 bity. W takim typie już się powinien zmieścić.

0

ogólnie to zarys programu jest jednak nie wiem jak mam posortować tą strukturę oraz czym zastąpić tab[n] i jak zadeklarować tablicę struktur jeśli nie znam liczby osób.proszę o pomoc

Wielkie dzięki za pomoc :)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


char nazwawe, nazwawy;
FILE *we=NULL,*wy=NULL;
#define MAX 65536
char *tab[MAX];

typedef struct{
char imie[30];
char nazwisko[30];
int PESEL[11];

}
osoba;

int main(int argc, char *argv[])
{

    	int i,n,len=0;
    	int tekst=0;
    	char buf[1024];
	if(argc != 3)
		{
		printf("Program potrzebuje nazwy pliku wejscia i wyjscia.\nPodaj nazwy z rozszerzeniami, oddzielone spacja!\n");
		return 0;
		}

	sscanf(argv[1],"%s", &nazwawe);
	sscanf(argv[2],"%s", &nazwawy);
	we=fopen(argv[1],"r+");

	if (we==NULL)
		{
			printf ("Nie moge otworzyc pliku wejsciowego %s. Plik jest uszkodzony lub nie istnieje\n", argv[1]);
			return 0;
		}

	wy=fopen(argv[2],"w+");
	if(wy==NULL)
		{
			printf("Nie moge utworzyc pliku o nazwie%s.\n", argv[2]);
			goto exit;
		}
	for (n=0; n<MAX; n++)/*pętla wczytująca dane*/
 		{
 		    tekst = fscanf(we, "%s", buf);

            if ( tekst == 0)
                {
                    printf ("\nBlad przy czytaniu z pliku: %s", argv[1]);
                    goto exit;
                }
            if (tekst == EOF) break;
            len = strlen(buf);
            tab[n] = (char *)malloc(len+1);
            if (tab[n]==0) goto exit;
            strcpy(tab[n], buf);
 		}
 		
/*Tutaj powinna być wywyolana funkcja sortijaca*/

    for (i=0; i<n; i++)/*pętla zapisująca posortowane dane*/
        {
            tekst = fprintf (wy, "%s\n", tab[i]);
            if (tekst<0)
            {
                printf ("\nBlad przy zapisie do pliku : %s", &nazwawy);
                goto exit;
            }
        }
    printf("\nWynik porzadkowania wyrazow w pliku: %s\n", &nazwawy);

    exit:
    for (i=0; i<n; i++) free(tab[i]);
    if (we) fclose(we);
    if (wy) fclose(wy);

    return 0;
}
 

1 użytkowników online, w tym zalogowanych: 0, gości: 1