• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Problem z funkcjami fgetc() fputc()

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
356 wizyt
pytanie zadane 19 grudnia 2022 w C i C++ przez Quba Użytkownik (870 p.)

Poniżej znajduje się kod, który miał za zadanie przepisać znak po znaku zawartość pliku dane2.txt do nowo utworzonego pliku dane3.txt. Program działa, kompiluje się i przenosi zawartość jednak jest pewien problem. Nie do końca przenosi ją poprawnie, ponieważ zawsze przenosi ją dodając znak w kolejnej linii. Próbowałem dowiedzieć się dlaczego się może tak dziać oraz także dowiedzieć się jak działają funkcje fgetc() fputc() jednak mimo wszystkich prób nie jestem w stanie wymyślić dlaczego tak się dzieje.

Mój kod:

#include <stdio.h>
#include <stdlib.h>
#define MAX 200

int main()
{
	FILE *plik,*plik1;
 	char znak;
 	
	plik=fopen("dane2.txt","r");
	if(plik==NULL)
	{
		printf("Plik - dane2.txt (output Zadania 2), z ktorego dane maja zostac skopiowane nie istnieje!");
		exit(1);
	}
	
	plik1=fopen("dane3.txt","w");
 	printf("Sukces! Dane zostaly skopiowane do pliku - dane3.txt");
 	
 	while(znak!=EOF)
 	{	
		znak=fgetc(plik);
 		fputc(znak,plik1); 	 		
	}

	
	fclose(plik);
	fclose(plik1);
	return 0;
 	
}

Tutaj treść pliku dane2.txt

I tak wygląda niepoprawnie skopiowany tekst z dodatkowym znakiem w kolejnej linii:

Z góry dziękuję za każdą pomoc!

1 odpowiedź

0 głosów
odpowiedź 20 grudnia 2022 przez j23 Mędrzec (195,220 p.)
wybrane 20 grudnia 2022 przez Quba
 
Najlepsza

Pętlę popraw:

while((znak = fgetc(plik)) != EOF) {   
    fputc(znak, plik1);          
}

 

komentarz 20 grudnia 2022 przez Quba Użytkownik (870 p.)

Działa! smiley Dziękuję bardzo za pomoc! Chciałbym jeszcze dopytać czy wiesz może co powodowało ten znak w kolejnej linii bo nie jestem wciąż pewien?

komentarz 20 grudnia 2022 przez j23 Mędrzec (195,220 p.)

Miałeś złą kolejność wykonywania działań w pętli:

  • sprawdzenie, czy znak nie jest EOF. Jeśli jest, koniec pętli.
  • czytanie znaku
  • zapis znaku

a powinno być:

  • czytanie znaku
  • sprawdzenie, czy nie jest EOF. Jeśli jest, koniec pętli.
  • zapis znaku, jeśli nie EOF

Ten dodatkowy znak końca linii spowodowany jest tym, że zapisywałeś EOF do pliku.

komentarz 20 grudnia 2022 przez Oscar Nałogowiec (29,340 p.)

@j23, Tylko zmienna znak powinna być przynajmniej shortem - fgetc zwraca od 0 do 255 gdy wczyta znak/byte z pliku i -1 jako EOF. Potrzeba coś większego niż char by odróżnić -1 od 255.

Podobne pytania

0 głosów
0 odpowiedzi 76 wizyt
+1 głos
1 odpowiedź 373 wizyt
pytanie zadane 23 stycznia 2022 w C i C++ przez Raven2221 Nowicjusz (200 p.)
0 głosów
1 odpowiedź 200 wizyt
pytanie zadane 23 października 2020 w C i C++ przez Colossus Mądrala (6,410 p.)

93,103 zapytań

142,077 odpowiedzi

321,575 komentarzy

62,445 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...