2013-02-04 22 views
5

Zastrzeżenie: jest to zadanie. Nie proszę o wyraźny kod. Raczej prosze tylko o wystarczającą pomoc, abym mógł zrozumieć mój problem i sam go poprawić.Plik IO wygląda na nieprawidłowy.

Próbuję odtworzyć narzędzie Unix ar zgodnie z zadaniami domowymi. Większość tego zadania dotyczy pliku IO w C, a inne części zajmują się wywoływaniem systemu itp.

W tym przypadku zamierzam utworzyć prosty listing wszystkich plików w archiwum. Nie dotarłem daleko, jak możesz zauważyć. Plan jest stosunkowo prosty: przeczytaj każdy nagłówek pliku z pliku archiwum i wydrukuj tylko wartość przechowywaną w ar_hdr.ar_name. Pozostałe pola będą pomijane przez fseek(), w tym dane pliku, aż do osiągnięcia innego pliku, w którym to momencie proces zaczyna się od nowa. Po osiągnięciu EOF funkcja po prostu się kończy.

Mam małe doświadczenie z plikiem IO, więc jestem już w niekorzystnej sytuacji z tym zadaniem. Zrobiłem co w mojej mocy, aby zbadać właściwe sposoby osiągnięcia moich celów i uważam, że wdrożyłem je najlepiej jak potrafię. To powiedziawszy, wydaje się, że coś jest nie tak z moim wdrożeniem. Dane z pliku archiwum nie wydają się być odczytywane lub przynajmniej przechowywane jako zmienna. Oto mój kod:

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); 
} 

W tym momencie chcę tylko móc poprawnie odczytać dane. Będę pracował nad szukaniem następnego pliku po tym, jak został zakończony. Chciałbym jednak raz jeszcze podkreślić, że nie proszę o wyraźny kod - muszę się tego nauczyć, a po przekazaniu mi działającego kodu tego nie zrobię.

+2

+1 za pisanie w sposób, który zmniejsza zapotrzebowanie na wszystkie komentarze "blah-blah coś o pracy domowej". – ChiefTwoPencils

Odpowiedz

3

pan zdefiniował char bufor o nazwie str do przechowywania danych, ale łączysz go z oddzielnego pamięć ar_hdr struktury o nazwie temp. Jak również, czytasz dane binarne jako ciąg znaków, który zostanie przerwany z powodu osadzonych wartości null.

Trzeba odczytać dane jako binarne i albo zmienić temp być wskaźnikiem do str lub odczytać bezpośrednio do temp użyciu coś jak:

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

(spojrzeć na doco dla fread - mój C jest zbyt zardzewiałe być tego pewnym). Upewnij się, że sprawdzasz i używasz wartości zwracanej.

+1

Myślę, że * próbował odczytać cały nagłówek na 'str', a następnie wyciągnąć z niego dane do swojej' temp' struct? –

+1

@Brian: Prawdopodobnie; Próbuję dać mu wskazówki, których potrzebuje. –

+0

@SoftwareMonkey: Brian ma rację, to była moja intencja. Wezmę kolejnego noża na mężczyznę i zobaczę, jakie zmiany muszę wprowadzić. Nie rozważałem możliwości osadzenia wartości null. Zamierzam użyć fseek(), aby pominąć wszystko oprócz informacji w nagłówku, więc jeśli nie ma w nim osadzonej wartości pustej, co byłoby poważnym problemem, uruchamianie wbudowanych wartości null nie powinno być problemem, prawda? – idigyourpast