operacje na plikach

0

witam. ma za zadanie pobrać tekst z pliku, przerobić go (np" jan ma psa na jacek ma psa") i zapisać w innym pliku.NIestety sprawia mi to problemy, gdyż jest to dla mnie nowe zagadnienie. Póki co próbuję przerzucić tekst z jednego pliku w drugi, ale coś krzaczy. Co robię źle?

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

int main (void){
FILE *plik, *plik2; 
char c;
plik = fopen ("C:\\Users\\Athlon\\Desktop\\plik_tekstowy.txt","r");  /*otwarcie pliku*/
if ((plik=fopen("C:\\Users\\Athlon\\Desktop\\plik_tekstowy.txt","r"))==NULL){
printf("\n blad otwarcia pliku tekstowego");
return 2;}
while (c=fgetc(plik) !=EOF)
 fputc(c,stdout); 
fclose (plik);


plik2 = fopen ("C:\\Users\\Athlon\\Desktop\\plik_tekstowy2.txt","wt");  /*zapisanie pliku*/
putc (c , plik2);
fclose (plik2);
while(!kbhit());
}
/code>
1
while (c=fgetc(plik) !=EOF) 

Ten fragment to tak niejawnie:

c=(pgetc(plik)!=EOF) 

(priorytety przypisań)
Czyli c przyjmuje w pętli zawsze warość true czyli jeden czyli uśmiechnięta buźka
popraw to na

 while ((c=fgetc(plik)) !=EOF)

nawias ma wyższy priorytet nad porównaniem i będzie banglać.

Jak jeszcze nie ogarniasz tego zbyt dobrze to nie twórz skomplikowanych porównań i zrób to np tak:

do{
c=fgetc(plik);
fputc(c,stdout);
}while (c!=EOF);

btw jak się robi tabulacje w kodzie na forum?:) przez jakiś czas chyba było shift+tab ale już nie działa.

0

dzieki wielkie za pomoc, ale widzę że coś jest bardziej pokrzywdzone.W zadaniu nie chodzi o to by tekst z pliku był wyświetlany w programie, a został przepisany z plik.txt do plik2.txt ... co jest źle? czy powinienem wymazać tą linijke?

 
plik = fopen ("C:\\Users\\Athlon\\Desktop\\plik_tekstowy.txt","r"); 



0

żeby nie bło że nie kombinuję... doszedłem do wniosku że coś jest nie tak tutaj:

 
plik2 = fopen ("C:\\Users\\Athlon\\Desktop\\plik_tekstowy2.txt","wt");  /*zapisanie pliku*/
putc (c , plik2);
fclose (plik2);

pewnie chodzi o putc..... próbowałem z fputs ale mi wywala errora ;/

1

jeśli chcesz przepisywać tekst z jednego pliku do drugiego (w pętli, po znaku) to obydwa pliki powinny być otwarte przed pętlą i w pętli get z jednego i put do drugiego
obecnie zapisujesz do drugiego pliku tylko ostatni pobrany znak, chyba, że kod się już zmienił jakoś, to wklej nową wersję;p

0

głąb jestem, oczywiście masz racje :D

działa, ale niestety to nie koniec.

 

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

int main (void){
FILE *plik, *plik2; 
char c;
plik = fopen ("C:\\Users\\Athlon\\Desktop\\plik_tekstowy.txt","r");  /*otwarcie pliku*/
plik2 = fopen ("C:\\Users\\Athlon\\Desktop\\plik_tekstowy2.txt","wt");  /*zapisanie pliku*/
if ((plik=fopen("C:\\Users\\Athlon\\Desktop\\plik_tekstowy.txt","r"))==NULL){
printf("\n blad otwarcia pliku tekstowego");
return 2;}
do{
c=fgetc(plik);
fputc(c,stdout);
fputc(c,plik2);
}while (c!=EOF);
fclose (plik);
fclose (plik2);
while(!kbhit());
}


nie będę już zakładał nowego tematu ale teraz w zasadzie zaczyna się dopiero właściwa treść zadania.Chodzi o to by w plik2.txt nie było "jan ma psa"(tak jest w plik1.txt) tylko np "jacek ma psa".Jak wyłowić wybrane słowa i je podmienić? rozumiem że poprzez string? czy można jakoś ułożyć to z for-em?

0

To jest tak:
Skasuj te 2 linijki z przipisaniem pliku i zostaw tylk to w ifie np tak:
<code=c++>
if (((plik=fopen("C:\Users\Athlon\Desktop\plik_tekstowy.txt","r"))==NULL)&&((plik2 = fopen ("C:\Users\Athlon\Desktop\plik_tekstowy2.txt","wt"))==NULL)){

Po drugie:
zamien char c na char *s i używaj do odczytywania wartości fscanf`a (działa tak samo jak dla konsoli - chodzi mi oto żebyś zczytywał słowa) funkcja z <string.h> porównuj z jacek  jak wystapi to zapisujesz tam jan (pamietaj o dodawaniu znaku spacji na końcu);
0

nie ma potrzeby dwukrotnie otwierać pierwszego pliku :)

a co do pytania, to zależy od tego co dokładnie masz zamienić na co :D trudno coś doradzić dla ogólnego problemu, co by zajmowało minimalną ilość kodu :p

0

w pliku pierwszym plik1.txt który jest stworzony powiedzmy pisze "Jacek ma psa".

chcę to przepuścić przez program, przepisać do plik2.txt i dodatkowo w miejscu gdzie w oryginale jest "jacek" wpisać "jan". Wynik zapisać w drugim pliku.I tyle :)

Fallen, nie bardzo rozumiem czemu mam zastąpić c wskaźnikiem...

0

w takim przypadku przychylam się do odpowiedz Fallena - wczytywać po słowie, a nie po znaku

a char* bo będziesz teraz wczytywał stringi, a nie pojedyncze znaku - char* zawiera wtedy adres pierwszego znaku stringa

0

Ale obaj zapomnieliście, że trzeba jeszcze zaalokować pamięć dla tego wczytywanego stringa

0

czyli to c musi zostać tak? a co do tego wskaźnika.... powiedzmy robię coś takiego tak? troche nie bardzo mi się to widzi bo ten wskaźnik ewidentnie wisi w powietrzu :/

 fscanf (plik, "%s", *s);



i tutaj teraz czym to podmienić? normalnie if-em?

0

co to znaczy, że wisi w powietrzu?;>

można ifem

0

raczej tak:

char *bufor = (char*)malloc(sizeof(char) * rozmiar_buforu);
fscanf(plik, "%s", bufor);

lub

char bufor[rozmiar_buforu];
fscanf(plik, "%s", bufor);
0
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main (void){
FILE *plik, *plik2; 
char c;
char bufor[40];

if (((plik=fopen("C:\\Users\\Athlon\\Desktop\\plik_tekstowy.txt","r"))==NULL)&&((plik2 = fopen ("C:\\Users\\Athlon\\Desktop\\plik_tekstowy2.txt","wt"))==NULL))
{
printf("\n blad otwarcia pliku tekstowego");
return 2;}
do{
c=fgetc(plik);
fputc(c,stdout);
fputc(c,plik2);
fscanf(plik, "%s", bufor);
if(bufor=ala )
printf(" kasia ");
}while (c!=EOF);
fclose (plik);
fclose (plik2);
while(!kbhit());
}

tak to miało wyglądać? pewnie nie :) jak zdefiniować bufor żeby był elastyczny?

0

Nie nie tak.

  1. w if'ie przy otwieraniu plików powinieneś mieć tam spójnik lub (||), a nie i (&&)
  2. zamiast fgetc i fputc użyj fscanf i fprintf
    3)if(bufor=ala) - jedno wielkie wtf - tak się nie porównuje stringów (już pomijając błędy składni) -> strcmp - google it!
0

wyrzucamy: fgetc, fputc
dokładamy: fprintf i jakieś else przy tym ifie

0
 
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main (void){
FILE *plik, *plik2; 
char c;


if (((plik=fopen("C:\\Users\\Athlon\\Desktop\\plik_tekstowy.txt","r"))==NULL)&&((plik2 = fopen ("C:\\Users\\Athlon\\Desktop\\plik_tekstowy2.txt","wt"))==NULL))
{
printf("\n blad otwarcia pliku tekstowego");
return 2;}
do{
fscanf(plik,"%s",c);
fprintf(plik2, c);
if{(strcmp(c, " ala ") !=0);
printf(" kasia ");
}}while (c!=EOF);
fclose (plik);
fclose (plik2);
while(!kbhit());
}



wyrzuca mi przy linijce:

 
fprintf(plik2, c);

a co do tego && i || to chyba bez różnicy, w końcu tak czy siak program nie sprawdza czy taki plik istnieje, tylko robi go samemu, nawet jeśli taki istnieje.

0

zerknij na fscanf`a i zastanów się co "zjadłeś"

a co do tego && i || to chyba bez różnicy, w końcu tak czy siak program nie sprawdza czy taki plik istnieje, tylko robi go samemu, nawet jeśli taki istnieje.

Jak by nie było różnicy to poco ten if :)
Tym ifem sprawdzasz czy udało się stworzyć plik

Jeżeli pierwszego lub drugiego nie udało się utworzyć to ma być zgłoszony błąd bo program się wysypie.

0

ok rozumiem ze chodzi o to że z "c" mam zrobić wskaźnik a w iscanfie wpisać &c zamiast c?czyli

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

int main (void){
FILE *plik, *plik2; 
char *c;


if (((plik=fopen("C:\\Users\\Athlon\\Desktop\\plik_tekstowy.txt","r"))==NULL)&&((plik2 = fopen ("C:\\Users\\Athlon\\Desktop\\plik_tekstowy2.txt","wt"))==NULL))
{
printf("\n blad otwarcia pliku tekstowego");
return 2;}
do{
fscanf(plik, "%s", &c);
fprintf(plik2, c);
if(strcmp(c, " ala ") !=0);
printf(" kasia ");
}
while (*c!=EOF);


fclose (plik);
fclose (plik2);
while(!kbhit());
}

no ale to nie działa, niestety... kończą mi sie pomysły :X

 
while (*c!=EOF);

ten fragment mi sie nie podoba ale nie wiem jak zrobić inaczej by mi nie krzyczał kompilator

0

To jest masakra. Nigdzie nie alokujesz pamięci na to co czytasz... kopiujesz z jednego pliku do drugiego - nigdzie nie sprawdzasz czy jakiś tam wyraz się pojawił... nie doczytałeś w dokumentacji co zwraca strcmp... warunek w while też do niczego się tu nie nadaje.

Jeszcze wymaga dopracowania (np. jak jeden wyraz będzie dłuższy niż 100 znaków, jak w pliku będzie kilka linii) pobaw się

#include <stdio.h>
#include <string.h>

int main()
{
	FILE *plik, *plik2;
	char c[100];


	if (((plik=fopen("C:\\Users\\Athlon\\Desktop\\plik_tekstowy.txt","r"))==NULL) || ((plik2 = fopen ("C:\\Users\\Athlon\\Desktop\\plik_tekstowy2.txt","wt"))==NULL))
	{
		if(plik) fclose(plik);
		printf("\n blad otwarcia pliku tekstowego");
		return 2;
	}

	while(fscanf(plik, "%100s", c) > 0)
	{
		if(strcmp(c, "ala") == 0)
			fprintf(plik2, "%s", "kasia");
		else
			fprintf(plik2, "%s", c);

		fprintf(plik2, "%s", " ");
	}

	fclose(plik);
	fclose(plik2);
}
0

dzięki.No zdaję sobie że mam spore braki ale ciągle się ucze :D

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