Skocz do zawartości

[C]Odczytywanie znaków z pliku.


gawan

Polecane posty

Witam ponownie.

Mam pytanie dotyczące zapisu i odczytu pojedynczych znaków do pliku. Mianowicie napisałem programy służące do zapisu i odczytu (kożystają one z systemu wejścia/wyjścia C). Kod prezentuję poniżej:

 

Zapis

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

int main(int argc, char *argv[])
{
       FILE *fp;
       char ch;

       if(argc==1)
       {
               printf("Zapomniałeś podać nazwę pliku.\n");
               exit(1);
       }


       if((fp = fopen(argv[1],"w"))==NULL)
       {
               printf("Nie można otworzyć pliku.\n");
               exit(1);
       }

       do{
               ch = getchar();
               fputc(ch,fp);
       } while(ch != '.');

       fclose(fp);
       return 0;
}

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

int main(int argc, char *argv[])
{
       FILE *fp;
       char ch;

       if(argc==1)
       {
               printf("Zapomniałeś podać nazwę pliku.\n");
               exit(1);
       }

       if((fp = fopen(argv[1],"r"))==NULL)
       {
               printf("Nie można otworzyć pliku.\n");
               exit(1);
       }

       ch = fgetc(fp);

       while(ch != EOF)
       {
       putchar(ch);
       ch = fgetc(fp);
       };

       fclose(fp);
       return 0;
}

 

Problem polega na tym, że po uruchomieniu programu Zapis rzeczywiście we wskazanym pliku znajdują się znaki które chciałem w nim umieścić. Sprawdzałem to poleceniem cat. Natomiast po uruchomieniu programu Odczyt zawartość pliku jest niszczona. Czy ktoś może mi powiedzieć dlaczego tak się dzieje? Z tego co samemu udało mi się dowiedzieć w opisanej sytuacji nie powinno mieć takie coś miejsca.

 

 

Edit:

Pokombinowałem trochę i okoazało się, że jeżeli pozbęde się instrukcji while(ch != EOF) to zastosowane funkcje wyświetlą na ekaranie pojedynczy znak. Czy ktoś może wiem, dlaczego ww. pętla kasuje zawartość pliku? Ja chyba tego nie jestem w stanie ogarnąć.

Link do komentarza
Udostępnij na innych stronach

while(ch != EOF)
       {
       putchar(ch);
       ch = fgetc(fp);
       };

Czy nie powinno być najpierw ch=getc(fp); a później ch=fgetc(fp); ?

Nie znam c, ale tak na logikę najpierw czytasz z pliku a dopiero później wysyłasz na monitor.

 

Przyjrzyj się tutaj: http://we.pb.edu.pl/~jforenc/2006_2007_01/PROG1-PWSIP-07.pdf

Przykład 3. Może o to chodzi.

Link do komentarza
Udostępnij na innych stronach

To znaczy tak.

Wymyśliłem już kod zastępczy (w sumie nie było za dużo do myślenia ^^), który grzecznie realizuje moje założenia.

Ma on następująca postać:

while(1)
       {
       if(ch == EOF) break;
       putchar(ch);
       ch = fgetc(fp);
       };

 

W tej chwili zastanawia mnie tylko co dzieje się w pierwszej wersji pętli. Jakby na to nie spojrzeć, zniszczenie zawartości pliku jest dosyć nieoczekiwanym rezultatem ^^

Link do komentarza
Udostępnij na innych stronach

  • 2 weeks later...

KOD0;) azrael@/Projekty/C_TEST/dist/Debug_C_99/MinGW-Windows

$ ./c_test.exe in

4

a bb

abs sfd

ewr w

wqeqweqweq eqweqwe

0;) azrael@/Projekty/C_TEST/dist/Debug_C_99/MinGW-Windows

$ cat in

4

a bb

abs sfd

ewr w

wqeqweqweq eqweqwe

U mnie pliku nie niszczy. Jesteś pewny, że kompilowałeś i uruchamiałeś dokładnie ten kod?

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...