Praca na plikach C

0

Witam, jestem nowy w C i mam problem z pobieraniem i wyprowadzaniem danych z plików.
Otrzymałem zadanie aby w zmienić w pliku co drugi znak na '@'. (np. 123456 na 1@3@5@)

Postanowiłem wczytać to do tablicy za pomocą fgets() a następnie co drugi jej element zmienić na '@', a następnie wypisać ją z powrotem do pliku. I tutaj napotkałem problem. (Jeżeli ktoś mógłby polecić jakiś tutorial, książkę itp. która by mi wyjaśniła jak w C pracuje się na plikach byłbym wdzięczny, w C++ nie miałem problemu ale tutaj to coś mi nie idzie)

1.Jak usunąć zawartość pliku i wpisać do niego zawartość nowej tablicy. (Probowalem fputs, fwrite ale nie jestem w stanie zrozumieć jak to działa)

                                FILE *plik2;
				char tablica[512];
				if((plik2=fopen("zadanie2.txt","r"))==NULL)
				{
				printf("Blad otwarcia pliku\n");
				return 1;
				}
				while(feof(plik2)==0)
				{
					fgets(tablica,512,plik2);
				}
				printf("Zawartosc tablicy: %s",tablica);
				fseek(plik2,0L,SEEK_SET);
				int i,j=0;
				for(i=1;i<sizeof(tablica);i++,j++)  // (*) Wykonuje sie 512 razy, tak wiem, że to przez sizeof(tablica)
				{
					if(i%2==0)
					{
					tablica[j]='@';
					}					
				}
				printf("\n %d",i);
				printf("\nZawartosc tablicy po zmianach: %s",tablica);
				fclose(plik2);
0

Może fread()/fwrite() będą lepsze.

0
Delor napisał(a):

Może fread()/fwrite() będą lepsze.

No okej ale czy ja chcąc wpisać coś do pliku za pomocą fwrite() musze zamykać ten [plik2=fopen("zadanie2.txt","r")] plik i otwierać go na nowo z możliwością zapisu ("w") [plik2=fopen("zadanie2.txt","w")]?

0

Jeszcze jest opcja fopen("nazawa", "rw")

0
enedil napisał(a):

Jeszcze jest opcja fopen("nazawa", "rw")

Okej, dzięki. Mógłby mi ktoś wyjaśnić jeszcze najważniejszą rzecz, tzn. jak wypisać tablice do pliku i usunąć to co w pliku jest? (wymienić)

0

Użyj: fopen("fname", "w"), lub fopen("fname", "w+").

0
lion137 napisał(a):

Użyj: fopen("fname", "w"), lub fopen("fname", "w+").

Zrozumiałeś moje pytanie? Ja chce wiedzieć zapisać do pliku, a nie jak otworzyć plik...

1

Do zapisu do plików w C masz do wyboru:

  • fwrite()
  • fprintf()

Przy czym wiedz Bracie, że praca z plikami wymaga sekwencji:

  • otworzyć plik z możliwością zapisu za pomocą fopen()
  • zapisać przy pomocy jednej z wcześniej wymienionych funkcji
  • zamknąć plik po zapisie wywołując fclose(). Krok ważny dlatego, że czyści bufor zapisu pliku.

W twoim konkretnym przypadku to przyda się pewnie fread żeby wczytać wszystko z pliku do tablicy, którą następnie pozmieniasz zastępując co 2 znak na @, i zapiszesz z powrotem.

0

@MasterBLB: Dzięki
Jest mi ktoś w stanie powiedzieć co robie nie tak? (Chce wypisać tablice do pliku, w pliku znajduje się 12345678910)

FILE *plik2;
				int i,j=0;
				char tablica[512];
				if((plik2=fopen("zadanie2.txt","rw"))==NULL)
				{
				printf("Blad otwarcia pliku\n");
				return 1;
				}
				memset(tablica,0,sizeof(tablica));
				while(feof(plik2)==0)
				{
					//fgets(tablica,512,plik2);
					fread(tablica,512,1,plik2);
				}
				printf("Zawartosc tablicy: %s",tablica);
				fseek(plik2,0L,SEEK_SET);
				while(tablica[j]!=0)
				{
					if(j%2==0)
					{
					tablica[j]='@';
					}	
					j++;				
				}
				printf("\n %d",j);
				printf("\nZawartosc tablicy po zmianach: %s",tablica);
				fseek(plik2,0L,SEEK_SET);
				fprintf(plik2,"%s",tablica);
				fclose(plik2);
0

Sprawdź co ci zwraca fread - https://en.cppreference.com/w/c/io/fread

0
MasterBLB napisał(a):

Sprawdź co ci zwraca fread - https://en.cppreference.com/w/c/io/fread

Poradziłem sobie z tym wystarczyło otworzyć plik z "R", następnie go zamknąć i otworzyć kolejny z "W" i tyle. Wyżej ktoś pisał, że jest coś takiego jak "WR" ale to nie działa. Sprawdzę co zwraca. Dzięki wszystkim, do zamknięcia :P

1 użytkowników online, w tym zalogowanych: 0, gości: 1