Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

C - Przepisywanie tekstu z pominięciem konkretnego słowa

jakubjakub121 26 Sty 2014 14:13 996 7
  • #1 26 Sty 2014 14:13
    jakubjakub121
    Poziom 1  

    Dany jest plik tekstowy a.txt. Przepisać ten plik na b.txt usuwając wszystkie wystąpienia sekwencji znaków 'egzamin'. Jak to zrobić używając fscanf i fprintf?

    0 7
  • #2 26 Sty 2014 22:14
    Krzysztof Gustaw
    Poziom 23  

    Witam!

    1) rezerwujesz bufor tekstowy od rozmiarze zapewniającym zmieszczenie najdłuższego słowa + 1
    2) Funkcją fscanf czytasz z pliku a.txt kolejne słowo. Jeśli fscanf zwróci wartość EOF to znaczy że przeczytany zostal cały plik
    3) Funkcją stricmp porównujesz przeczytane do bufora słowo z wzorcem "egzamin"
    4) Jeśli rezultat porównania jest różny od zera to zapisujesz słowo z bufora do pliku b.txt funkcją fprintf w przeciwnym wypadku czytasz następne słowo

    0
  • #3 26 Sty 2014 22:39
    krru
    Poziom 32  

    Będzie problem z białymi znakami (np. nowymi liniami). fscanf z parametrem "%s" zignoruje takie znaki.

    0
  • #4 26 Sty 2014 23:33
    Krzysztof Gustaw
    Poziom 23  

    Witam!
    I dlatego w fprintf wzorzec powinien wyglądać: "%s " (pomiędzy s a zamykającym znakiem cala powinna wystąpić spacja)

    0
  • #5 26 Sty 2014 23:42
    krru
    Poziom 32  

    To nic nie zmienia - spacja w stringu formatującym oznacza pominięcie dowolnej liczby białych znaków. %s robi to samo, tyle że przed czytanie wyrazu.

    0
  • #6 27 Sty 2014 00:08
    Krzysztof Gustaw
    Poziom 23  

    Witam ponownie!
    Trzeba po prostu umiejętnie posłużyć się formatami.
    Jeśli chodzi o sscanf i jej pochodne, to można stosować do czytania słów format "%s" a do czytania pojedynczych znaków format "%c", w którym to czytane i interpretowane są wszystkie znaki. Jeśli przeczytany przez sscanf z formatem "%c" znak nie jest "białym znakiem" to np funkcją ungetc cofamy go z powrotem do pliku po czym wywołujemy fscanf z formatem "%s" w celu przeczytania słowa. W przeciwnym wypadku wysyłamy go bezpośrednio do pliku docelowego albo, pośrednio, wpisując go do bufora (oczywiście nie zapominając o znaku '\0') i używając funkcji fprintf. Można również znaku nie cofać tylko przepisać go na początek bufora po czym funkcją fscanf z formatem %s dopisać resztę wyrazu do bufora podając adres bufora o 1 większy.

    0
  • #7 27 Sty 2014 07:06
    krru
    Poziom 32  

    Ta druga metoda będzie miała problem z jednoliterowymi 'wyrazami'.

    0
  • #8 27 Sty 2014 20:59
    Krzysztof Gustaw
    Poziom 23  

    Witam!
    Ano, Kolego Krru "mocie recht!" Jak mogłem to przegapić! Chyba się starzeję... Zatem pozostaje wersja z ungetc którą tak w ogóle fukcje z rodziny fscanf również szczodrze używają. No, ale decyzja należy do Kolegi Jakubjakub121 bo to on jest (chyba) najbardziej zainteresowany :)

    0