/* Det här är ett skelett för en möjlig lösning på C/C++ Labb 2 uppgift 2. */ //Inkludera nödvändiga bibliotek! #define MAX_LANGD 255 #define SKRIV_ADRESSER 3 typedef struct t_adress { char fornamn[MAX_LANGD]; char efternamn[MAX_LANGD]; char gatuadress[MAX_LANGD]; int postnummer; char postanstalt[MAX_LANGD]; } kontakt; /* Läser in en adress */ void las_in_adress(kontakt *adress); /* Läser in en textrad och tar bort newline tecknet */ void las_rad(char *string, int maxlangd); /* Räknar ut antalet adresser i en fil */ int ge_antal_adresser(FILE *file); /* Allokerar utrymme för och läser in antal_strukturer adresser från fil. Returnerar pekare till minnesområdet */ unsigned char *las_data_filen(FILE *file, int antal_strukturer); /* Skriver ut antal_strukturer förnamn och efternamn ur data_buffer */ void skriv_ut_adresser(unsigned char *data_buffer, int antal_strukturer); int main(int argc, char *argv[]) { unsigned char *data_buffer = NULL; FILE *p_file; kontakt temp_adress; int i, antal_strukturer; // Kolla att vi har gett ett argument till programmet. if (argc < 2) { perror("Ge ett filnamn som argument!"); return -1; } /* Om fopen returnerar NULL då vi försöker öppna filen för läsning, och det berodde på att filen inte existerar, öppna filen för skrivning istället. */ if ((p_file = fopen(argv[1], "rb")) == NULL) { if (errno == /* Sök det rätta felmeddelandet i errno.h */) { if ((p_file = fopen(argv[1], "wb")) == NULL) { perror("Kunde inte öppna filen för skrivning"); } else { /* Läs in minst 3 adresser i filen */ for (i = 0; i < SKRIV_ADRESSER; i++) { las_in_adress(&temp_adress); fwrite(/* fwrite parametrar */); } /* Kom ihåg att stänga filen! */ fclose(p_file); } } else perror("Fel med öppnande av fil för läsning"); } else { /* Filen existerade. Läs då in adresserna från filen. */ antal_strukturer = ge_antal_adresser(p_file); data_buffer = las_data_filen(p_file, antal_strukturer); skriv_ut_adresser(data_buffer, antal_strukturer); /* Kom ihåg att frigöra minnet du allokerat! */ if (antal_strukturer > 0) free(data_buffer); fclose(p_file); } return 0; } void las_rad(char *string, int maxlangd) { fgets(string, maxlangd, stdin); string[strlen(string)-1] = '\0'; } int ge_antal_adresser(FILE *file) { long fil_storlek; int antal_strukturer; /* Ta reda på filstorleken, t.ex. med hjälp av fseek och ftell. Fseek ändrar på positionen i filen därifrån läsning/skrivning sker. Gå tillbaka till filens början med rewind(...). Utgående från filstorleken kan du beräkna hur många adresser filen innehåller */ return antal_strukturer; } unsigned char *las_data_filen(FILE * file, int antal_strukturer) { unsigned char *data_buffer; int i; /* Allokera minne för adresserna */ /* Läs data från filen till buffern. Fread() är din vän */ return data_buffer; } void skriv_ut_adresser(unsigned char *data_buffer, int antal_strukturer) { int i; kontakt *adress; /* Tips: Du kan t.ex. casta data buffer till en kontakt pekare (kontakt *). Då kan pekaren inkrementeras med 1 (vilket betyder 1*sizeof(kontakt)) för att peka på nästa adress osv. */ }