Jak otworzyc wybrany plik txt, usunac wybrane znaki, badz ci

0

Jak otworzyc wybrany plik txt, usunac wybrane znaki, badz ciagi znakow i zapisac zmieniony plik z nowa nazwa?
Udalo mi sie "osiagnac" to:

#include &ltstdio.h&gt
#include &ltconio.h&gt

main()
{
char tab[10]={0,0,0,0,0,0,0,0,0,0};
int znak=0;
FILE *in, *out;
clrscr();
printf("\nProgram otworzy plik o nazwie, ktora wpiszesz\ni zapisze cala jego zawartosc do pliku o nazwie, jaka podasz.\nLiczba znakow, z jakiej musi sie skladac plik zrodlowy i wynikowy to 10.");
printf("\n\n\n\nNazwa pliku: ");
scanf("%s",&tab);

in=fopen(tab,"r");
  	if (in==NULL)
  	{
  		printf("\\nNie mozna otwozyc pliku %s",tab);
  		return 1;
  	}
     if (znak!=EOF)
     	{
     	if (znak=='\\n') znak=' ';
            }
   printf("\\nWpisz nowa nazwe pliku: ");
   scanf("%s",&tab);
  out=fopen(tab, "w");
  	if (out==NULL)
     {
     	printf("\\nNie mozna zamknac pliku: %s",tab);
     	return 1;
     }
     while (!feof(in))
     	fputc(fgetc(in), out);
	fclose(in);
  fclose(out);
  printf("\\n\\n\\nStworzono plik: %s",tab);

return 0;
}

Z gory dziekuje za pomoc :)))

0

Coś czuję, że trochęsobie poczekasz na odpowiedź, bo prawie wszyscy, jak nie patrzeć, Delphiowcy :| --You may say I am dreamer...

0

Skoro Delphiowcy, to moze cos takiego pod delphi by sie dalo napisac....?

0

No nie wszyscy to delphiowcy. Oki do rzeczy. Rozumiem to tak ze z danego pliku chcesz usunac ciagi znakow odpowiadajace wzrorcowi. Jezeli tak to sprawa nie jest trudna, nie bede jednak podawal ci gotowego rozwiazania gdyz jest bardzo krotkie i w mig napiszesz je samemu. Mozna to zrobic kilkoma sposobami, podam ci jeden z nich. Zamiast funkcji fgetc, uzyj funkcji fgets pobierajacej nie znak ale cala linijke (do znaku \0), i w tej linijce sprawdzaj wystepowanie szukanego wzorca. Jest kilka ciekawych funkcji do operacji na lancuchach znakow w pliku naglowkowym string.h - tam znajdziesz wszystko co ci potrzeba

0

Gwoli jasności: napisałem PRAWIE wszyscy :)--You may say I am dreamer...

0

No niestety... nie wiem co tu napisac...
A konkretnie efekt koncowy programu mialby wygladac tak:
czytanie pliku txt, usuwanie zakonczenia linii, czyli: '\n'. Wiec wydaje m sie ze lancuch tutaj nie pasuje. Raczej ide w strone petli czytania znaku, sprawdzania, czy znajduje sie wyzej wymieniony znak, badz tez inny, w zaleznosci od zdefiniwania, nastepnie zamienienie go na inny, tez do zdefiniowania znak, badz usuwam i zapisuje calosci pliku txt pod inna nazwa.
No tylko mam problem z czytaniem i zamiana znaku, reszta, tak mi sie wydaje, jest oka.
Leze tutaj...

 if (znak!=EOF) 
 { 
 if (znak=='\\n') znak=' '; 
 } 

...tutaj proponuje zamiane na znak spacji. Ale po wykonaniu calego programu kopiuje mi sie tylko zawartosc zrodla do nowego pliku, dopisujac 1 znak (jakas kropeczka: "˙") na koncu dokumentu, zamiast zamiana znakow '\n', czyli entera na spacje.

hm.. awaria...

0

a teraz cos takiego wykonalem:

#include &ltstdio.h&gt
#include &ltconio.h&gt
#include &ltstring.h&gt

main()
{
char tab[10]={0,0,0,0,0,0,0,0,0,0};
char buff[1024];
int pos=0;
FILE *in, *out;
clrscr();
printf("\nProgram otworzy plik o nazwie, ktora wpiszesz\ni zapisze cala jego zawartosc do pliku o nazwie, jaka podasz.\nLiczba znakow, z jakiej musi sie skladac plik zrodlowy i wynikowy to 10.");
printf("\n\n\n\nNazwa pliku: ");
scanf("%s",&tab);

in=fopen(tab,"r");
    	if (in==NULL)
  	{
  		printf("\\nNie mozna otwozyc pliku %s",tab);
  		return 1;
  	}

		while( fgets( buff, 1024, file_handle ) )
		{
			while( pos = strchr( buff, '\\n' ) )
        {
        	buff[pos] = ' ';
			}



   printf("\\nWpisz nowa nazwe pliku: ");
   scanf("%s",&tab);
  out=fopen(tab, "w");
  	if (out==NULL)
     {
     	printf("\\nNie mozna zamknac pliku: %s",tab);
     	return 1;
     }
     while (!feof(in))
     	fputc(fgetc(in), out);
	fclose(in);
  fclose(out);
  printf("\\n\\n\\nStworzono plik: %s",tab);

return 0;
}

Jakies rady???

0

problem tu jest taki, ze zamieniasz znaki konca lini w buforze ale tracisz wszystko bo zachowujesz w tym samym buforze nowa linie nie zapisujac wczesniej jej do nowego pliku
Podobny problem byl w poprzednich kodach.

Oto zmieniony kod mysle, ze bedzie dobrze dzialal

#include &ltstdio.h&gt
#include &ltconio.h&gt
#include &ltstring.h&gt

main()
{
char tab[13]={0}; *tu nie trzeba wpisywac wszystkich zer bo kompilator automatycznie to robi
*nie wiem dlaczego akurat 10 znakow powinna miec nazwa pliku??
*mysle ze powinna byc 8+kropka+3=12 + to ze to jest string (na koncu jest jeszcze '\0', wiec tablica powinna miec 13
*gorzej jezeli ktos wpisuje cala sciezke dostepu :)
char buff[1024+1]={0}; *zerujemy zeby nie wypisywalo smieci !!!!!
* +1 na koncowe 0 dla prawidlowego obliczenia dlugosci stringu w funkcji fwrite
char *pos=NULL; *pozycja powinna byla byc wskaznikiem do znakow
FILE *in, *out;

clrscr();
printf("\nProgram otworzy plik o nazwie, ktora wpiszesz\ni zapisze cala jego zawartosc do pliku o nazwie, jaka podasz.\nLiczba znakow, z jakiej musi sie skladac plik zrodlowy i wynikowy to 10.");
printf("\n\n\n\nNazwa pliku: ");
scanf("%s",&tab);

if ((in=fopen(tab,"r"))==NULL) *tu mozna to troszke skrocic, ale to szczegoly
{
printf("\nNie mozna otwozyc pliku %s",tab);
return 1;
}

printf("\nWpisz nowa nazwe pliku: ");
scanf("%s",&tab);
out=fopen(tab, "w");
if (out==NULL)
{
printf("\nNie mozna zamknac pliku: %s",tab); *nie rozumiem tego komunikatu, przciez nic nie zamykasz :)
return 1;
}

/* while( fgets(buff,1024,in)) *nie wiem co tu robilo file_handle ?????
{
while( pos = strchr( buff, '\n' ) )
{
buff[pos] = ' ';
}
} */
*fgets tez nie jest najlepszym rozwiazaniem bo pobiera cala linijke lub jezeli jest za dluzsza niz (u ciebie 1024) to te 1024 znaki

*proponuje zastosowac fread i fwrite

while (fread(buff,sizeof(char),1024,in)) *czytanie co najwyzej 1024 znakow z pliki in
{
while(pos=strchr(buff,'\n'))
*pos=' '; *w miejscu znalezienia znaku konca linii wpisujemy ' '
fwrite(buff,sizeof(char),strlen(buff),out); *wczytanie danego bufora do pliku o dlugosci bufora (strlen(buff))
strset(buff,0); *zerowanie bufora
}

/* while (!feof(in))
fputc(fgetc(in), out); */ //to tu jest na moj gust troche bez sensu, bo kopiuje stary plik do nowego

fclose(in);
fclose(out);
printf("\n\n\nStworzono plik: %s",tab);
return 0;
}

--Eryk

0

Dziekuje Ci Eryk, oraz oczywiscie innym serdecznie dziekuje za pomoc :)
Dziala :)
A co optymalizacji kodu, to zaraz pogrzebie w ksiazce i pozamieniam.
Natomiast ilosci znakow, z ktorych skladac ma sie nazwa pliku do zaladowania i do zapisania, zmienie na cztery, te po kropce, poniewaz tworzac stronke internetowa, zapisuje pliki jako nazwa_stronki.html, czyli cztery znaki uzywam po kropce :)
Dzieki.

0

Jescze jedno zapytanie:

A jak by nie zamieniac znaku '\n', tylko go usunac, co musialbym wpisac zamiast tego fragmentu:

while (fread(buff,sizeof(char),1024,in))
{
while(pos=strchr(buff,'\n'))
*pos=' ';
fwrite(buff,sizeof(char),strlen(buff),out);
strset(buff,0);
}

Lub jeszcze jedno zapytanie. Maianowicie, jesli chcialbym usunac wiecej niz dwa znaki SPACJI: ' ', jakiej komendy musialbym uzyc?

Dziekuje za odpowiedz.

0

&gtA jak by nie zamieniac znaku '\n'

jezeli chcesz tam usunac znak konca to proponuje tak (moze da sie inaczej, ale to chyba dziala dobrze :) )

while (fread(buff,sizeof(char),1024,in))
{
while(pos=strchr(buff,'\n'))
{
strcpy(pom,pos+1); *skopiwanie dalszej czesci (po '\n')
strcpy(pos,pom,strlen(pos)); *skopiowanie dalszej czesci w m-cu gdzie byl '\n'
}

  fwrite(buff,sizeof(char),strlen(buff),out); 
  strset(buff,0);    *zerowanie bufora

}

&gtLub jeszcze jedno zapytanie. Maianowicie, jesli chcialbym usunac wiecej niz dwa znaki SPACJI: ' ', jakiej komendy musialbym uzyc?

Proponuję tak:
szukasz spacji, jak znajdziesz to sprawdzasz co jest dalej. Jezeli spacja to usuwasz
(rozwiazanie jezeli nie chcesz wszystkiego robic na raz)

int spacje(char *bufor,FILE **we,FILE **wy)
{
char *pom1,*pom2,*pos;
fseek(*we,0L,SEEK_SET);
while (fread(bufor,sizeof(char),1024,we))
{
pos=bufor;
while(pos=strchr(pos,' '))
{
pom1=pos++;
while(
(++pom1)==' '); *idz do m-ca gdzie nie ma ' '
if(pom1!=pos)
{
strcpy(pom2,pom1);
strncpy(pos,pom2,strlen(pos));
}
}
fwrite(bufor,sizeof(char),strlen(bufor),*wy);
strset(bufor,0); //zerowanie bufora
}
return 0;
}

main()
...
spacje(buff,&in,&wy);
...

Ten program sie zle zachowa jezeli akurat spacje beda rozdzielone miedzy buforami. Trzeba nad tym popracowac :)

Pozdrawiam--Eryk

0

mala poprawka, to powinno wygladac tak:

while (fread(buff,sizeof(char),1024,in))
{
while(pos=strchr(buff,'\n'))
{
strcpy(pom,pos+1); *skopiwanie dalszej czesci (po '\n')
strncpy(pos,pom,strlen(pos)); *skopiowanie dalszej czesci w m-cu gdzie byl '\n'
}

  fwrite(buff,sizeof(char),strlen(buff),out); 
  strset(buff,0);    //zerowanie bufora

}
--Eryk

0

Dziekuje, pogrzebie sobie w tym kodzie :)
PS. A moze ktos posa mi jakies stronki dla bardzo, bardzo, bardzo zielonych???
Aby na przykladach, tych najprostrzych, zaglebic sie w tajniki C.
Jeszcze raz DZIEKI :)

0

wrr... blad wyskakuje :( ale dlaczego... nie wiem...

Moze ktos rzuci okiem na ten kod...

#include &ltstdio.h&gt
#include &ltconio.h&gt
#include &ltstring.h&gt
main()
{
char tab[13]={0};
char buff[1024+1]={0};
char *pos=NULL;
char *pom=NULL;
FILE *in, *out;
printf("\nProgram otworzy plik o podanej nazwie i po zamianie znakow ENTER na SPACJE,\nzapisze zmieniona zawartosc do pliku o podanej nazwie.\nLiczba znakow, z jakiej musi sie skladac plik zrodlowy i wynikowy to 13.");
printf("\n\n\n\nNazwa pliku: ");
scanf("%s",&tab);
if ((in=fopen(tab,"r"))==NULL)
{
printf("\nNie mozna otwozyc pliku %s",tab);
return 1;
}
printf("\nWpisz nowa nazwe pliku: ");
scanf("%s",&tab);
out=fopen(tab, "w");

while (fread(buff,sizeof(char),1024,in))
{
while(pos=strchr(buff,'\n'))
{
strcpy(pom,pos+1);
strncpy(pos,pom,strlen(pos));
}
fwrite(buff,sizeof(char),strlen(buff),out);
strset(buff,0);
}
fclose(in);
fclose(out);
printf("\n\n\nStworzono plik: %s",tab);
return 0;
}

i moze... poprawi...?

0

joka2 napisał:
wrr... blad wyskakuje :( ale dlaczego... nie wiem...

Ciekawe hmm... u mnie nic nie wyskakuje
jaki blad??
(no jedynie troche smieci drukowalo, po takiej zmianie nie drukuje - pozbycie sie wskaznika pom)

while (fread(buff,sizeof(char),1024,in))
{
while(pos=strchr(buff,'\n'))
strcpy(pos,pos+1); // &lt-- tutaj zmiana
fwrite(buff,sizeof(char),strlen(buff),out);
strset(buff,0);
}
--Eryk

0

Dziekuje jeszcze raz, ale nadal mi ten programik wiesza komputer :)

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