2013-02-04 13 views
5

Disclaimer: questo è per un incarico. Non sto chiedendo il codice esplicito. Piuttosto, chiedo solo un aiuto sufficiente per capire il mio problema e correggerlo da solo.File IO non sembra essere letto correttamente

Sto tentando di ricreare l'utilità Unix ar come per un compito a casa. La maggior parte di questo incarico riguarda il file IO in C e altre parti riguardano chiamate di sistema, ecc.

In questo caso, ho intenzione di creare un semplice elenco di tutti i file all'interno dell'archivio. Non sono andato lontano, come puoi notare. Il piano è relativamente semplice: leggi ogni intestazione di file da un file di archivio e stampa solo il valore contenuto in ar_hdr.ar_name. Il resto dei campi verrà saltato tramite fseek(), inclusi i dati del file, fino a quando non viene raggiunto un altro file, a quel punto il processo ricomincia. Se EOF viene raggiunto, la funzione termina semplicemente.

Ho poca esperienza con il file IO, quindi sono già in svantaggio con questo incarico. Ho fatto del mio meglio per ricercare metodi adeguati per raggiungere i miei obiettivi, e credo di averli implementati al meglio delle mie capacità. Detto questo, sembra che ci sia qualcosa di sbagliato nella mia implementazione. I dati dal file di archivio non sembrano essere letti, o almeno memorizzati come variabili. Ecco il mio codice:

struct ar_hdr 
{ 
    char ar_name[16]; /* name */ 
    char ar_date[12]; /* modification time */ 
    char ar_uid[6];  /* user id */ 
    char ar_gid[6];  /* group id */ 
    char ar_mode[8]; /* octal file permissions */ 
    char ar_size[10]; /* size in bytes */ 
}; 

void table() 
{ 
    FILE *stream; 
    char str[sizeof(struct ar_hdr)]; 
    struct ar_hdr temp; 

    stream = fopen("archive.txt", "r"); 
    if (stream == 0) 
    { 
     perror("error"); 
     exit(0); 
    } 

    while (fgets(str, sizeof(str), stream) != NULL) 
    { 
     fscanf(stream, "%[^\t]", temp.ar_name); 
     printf("%s\n", temp.ar_name); 
    } 
    if (feof(stream)) 
    { 
     // hit end of file 
     printf("End of file reached\n"); 
    } 
    else 
    { 
     // other error interrupted the read 
     printf("Error: feed interrupted unexpectedly\n"); 
    } 

    fclose(stream); 
} 

A questo punto, voglio solo essere in grado di leggere i dati correttamente. Lavorerò alla ricerca del prossimo file dopo che è stato completato. Vorrei ribadire il mio punto, tuttavia, che non sto chiedendo un codice esplicito - ho bisogno di imparare queste cose e il fatto che qualcuno mi fornisca un codice funzionante non lo farà.

+2

+1 per scrivere in un modo che allevia la necessità di tutti i commenti "bla blab a proposito dei compiti". – ChiefTwoPencils

risposta

3

Hai definito un buffer di nome charstr per tenere i vostri dati, ma si accede da una struttura separata di memoria ar_hdr nome temp. Inoltre, stai leggendo dati binari come una stringa che si interromperà a causa di null incorporati.

hai bisogno di leggere dati binari e di cambiare sia temp ad essere un puntatore a str o leggere direttamente in temp usando qualcosa come:

ret=fread(&temp,sizeof(temp),1,stream); 

(guardare il doco per fread - la mia C è troppo arrugginito per esserne sicuri). Assicurati di controllare e utilizzare il valore restituito.

+1

I * think * stava provando a leggere l'intera intestazione in 'str', quindi estrarre i dati da quello nella sua struttura' temp'? –

+1

@Brian: Forse; Sto cercando di dargli gli indicatori di cui ha bisogno. –

+0

@SoftwareMonkey: Brian ha ragione, era mia intenzione. Prenderò un'altra pugnalata all'uomo per vederlo e vedere quali cambiamenti devo fare. Non avevo considerato la possibilità di null incorporati. Intendo usare fseek() per saltare tutto tranne le informazioni di intestazione, quindi a meno che non ci sia un valore nullo incorporato, il che sarebbe un problema serio, l'esecuzione di null incorporati non dovrebbe essere un problema, giusto? – idigyourpast

Problemi correlati