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.

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