Ciao, questa è la consegna dell'esercizio:
Creare i file ip.h e ip.c che consentano di utilizzare la seguente funzione:
extern uint32_t *leggi_indirizzi_ip(const char *filename, size_t *size);
La funzione riceve il nome di un file da aprire in modalità lettura tradotta (testo), e
un puntatore ad un size_t. Il file contiene una sequenza di righe contenenti indirizzi IP
in formato testo, ovvero quattro numeri interi da 0 a 255 separati da tre punti. Ad
esempio:
127.0.0.1?
10.0.42.3?
78.15.46.23?
La funzione deve convertire il file in una sequenza allocata dinamicamente di numeri
interi a 32 bit in big endian. Ogni numero è formato dai 4 byte corrispondenti ai valori
degli indirizzi IP. Nel caso precedente, la funzione dovrebbe allocare 3 interi a 32 bit,
che contengano i valori 0x7F000001, 0x0A002A03, 0x4E0F2E17. La variabile puntata da size
deve essere impostata al numero di valori letti.
Se il file è vuoto o non esiste, se contiene numeri non compresi nell’intervallo
rappresentabile in un byte o se contiene linee incomplete, la funzione ritorna NULL e
imposta size a 0.
Questo è il mio file.h:
#if !defined IP_H
#define IP_H
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<stdint.h>
extern uint32_t *leggi_indirizzi_ip(const char *filename, size_t *size);
#endif
questo è il mio main.c:
#include "ip.h"
int main(){
size_t *size;
uint32_t ris = leggi_indirizzi_ip("leggo.txt", &size);
return ris;
}
questo è il mio file.c:
#include "ip.h"
uint32_t *leggi_indirizzi_ip(const char *filename, size_t *size){
FILE *f = fopen(filename, "rt");
if (f == NULL){
*size = 0;
return NULL;
}
uint32_t n1, n2, n3, n4;
while (1){
if (fscanf(f, "%u.%u.%u.%u", &n1, &n2, &n3, &n4) != 4){
break;
}
}
}
In questo problema faccio una semplice lettura e poi realloco tranquillamente in memoria.. però mi sono bloccato e non riesco ad andare avanti. Il mio problema sta nel fatto che non so proprio come si faccia a convertire in Big endian. Qualcuno lo sa?