Bílé znaky v souboru – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Bílé znaky v souboru – C / C++ – Fórum – Programujte.comBílé znaky v souboru – C / C++ – Fórum – Programujte.com

 

Hanule
~ Anonymní uživatel
37 příspěvků
8. 12. 2012   #1
-
0
-

Ahoj, potřebuji udělat program, který načítá ze vstupního souboru (soubor1) znaky, které obsahují i posloupnosti bílých znaků. Program má načíst ze souboru1 a zapsat do vystupu (soubor2) text tak, že kde najde posloupnost bílých znaků, zapíše jenom jeden.

Příklad vstupu:                                                 Příklad výstupu:

Toto je                                                               Toto je prvni veta.
prvni  veta. A toto                                                 Toto je druha veta.
je
         druha
       veta.

Můj kód je takový (otevření a zavreni souboru funguje, ale část, která má zpracovat text už ne)

   char c[2];
    //nacte znak a zapise ho do druhoho souboru
    while (!feof(soubor1))
    {
        fscanf(soubor1, "%1s",c);
        //kdyz narazi na tecku, odradkuje
        if(c=='.') fprintf(soubor2,"\n");
        else fprintf(soubor2, "%s",c);
        if(c==' ')
        { //kdyz je nasledujici znak mezera, zapise jen jednu
            if((c+1)==' ') fprintf(soubor2, " ");
        }
        

Poradíte mi prosím proč nepracuje tak jak má?

Nahlásit jako SPAM
IP: 91.219.242.–
KIIV
~ Moderátor
+43
God of flame
8. 12. 2012   #2
-
0
-

byt tebou, tak bude lepsi pouzit jeden znak a nacitat pomoci %c ... %1s by mohlo preskakovat mezery..  a pak jeste retezec se neda srovnavat takhle:   c == '.'   ...  c je adresa v pameti

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Hanule
~ Anonymní uživatel
37 příspěvků
8. 12. 2012   #3
-
0
-

#2 KIIV
Mno já když jsem tam dala

fscanf(soubor1, "%c",c);
       fprintf(soubor2, "%c",c);

tak mě padal program, i když jsem měla podmínku feof. Tak jsem to zkoušel %1s.

Hm? A jak bych to měla srovnat? Mě jinej způsob nenapadl...

Nahlásit jako SPAM
IP: 91.219.242.–
KIIV
~ Moderátor
+43
God of flame
8. 12. 2012   #4
-
0
-

a c bylo deklarovano jako:    char c; ?     pak teda fscanf by mel mit &c

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Hanule
~ Anonymní uživatel
37 příspěvků
8. 12. 2012   #5
-
0
-

#4 KIIV
Aha...tak proto to padalo. Já už jsem z toho trošku zblblá. Mno ale stejně mi nějak nefunguje to "ignorování" posloupnosti bílých znaků...

Já jsem to chtěla udělat tak, že pokud narazí na bílý znak, tak ověří, jestli vedle něj je bílý znak a pokud ano, tak zapíše jenom jednu mezeru. ale nějak to nefunguje tento postup.

Nahlásit jako SPAM
IP: 91.219.242.–
KIIV
~ Moderátor
+43
God of flame
8. 12. 2012   #6
-
0
-

#5 Hanule
to bude chtit nejakej stav... neco jako kdyz vypises enter nebo mezeru tak nastavit "stav" mezera a pokud narazis na dalsi mezeru tak uz nevypisovat

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
KIIV
~ Moderátor
+43
God of flame
8. 12. 2012   #7
-
0
-

jo to (c+1)==' '  neni dobrej napad...

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Hanule
~ Anonymní uživatel
37 příspěvků
8. 12. 2012   #8
-
0
-

#7 KIIV
Mno já teď zkouším něco s tím stavem. Ale moc mě nic nenapada...

Zkouším přidat funkci, která by měla vyhodnotit, jestli jde o bílý znak a pak to na to snad nějak navážu.

Proč to není dobrý nápad?

Nahlásit jako SPAM
IP: 91.219.242.–
KIIV
~ Moderátor
+43
God of flame
8. 12. 2012   #9
-
0
-

takova funkce i existuje: isspace v ctype.h ...  vesmes je todle vyreseny v nedavnym vlaknu...

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Hanule
~ Anonymní uživatel
37 příspěvků
8. 12. 2012   #10
-
0
-

#9 KIIV
jj to vím o isspace.

To vlákno, jsem ale nenašla...:(

Neporadil by jsi mi nějakej návod na to "nahrazeni posloupnosti" ?

Nahlásit jako SPAM
IP: 91.219.242.–
KIIV
~ Moderátor
+43
God of flame
9. 12. 2012   #11
-
0
-

no prave ze si jen pred cyklem udelas promennou "byl_whitespace" s hodnotou 1 (chces preskocit prazdny znaky na zacatku radku). A pokud narazis na whitespace tak pokud ta promenna je 0 tak vypises mezeru a nastavis byl_whitespace=1... pokud je 1 tak nedelas nic... pokud narazis na tecku tak odradkujes a nastavis si zase byl_whitespace=1...

a jinak vypises znak a nastavis byl_whitespace=0

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
KIIV
~ Moderátor
+43
God of flame
9. 12. 2012   #12
-
0
-

mimochodem da se tam pridat jeste i promenna pro zacatek radku (ta se nastavi pokazdy, kdyz se odentruje (a startovaci hodnota taky jako zacatek radku)...

pak ani neradkovat kdyz je . na zacatku radky... 

          ......................... Toto je
prvni  veta. A toto
je
         druha
       veta   ...   .    .Treti



veta.

by pak melo vylezt jako:

Toto je prvni veta.
A toto je druha veta.
Treti veta.
Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Hanule
~ Anonymní uživatel
37 příspěvků
9. 12. 2012   #13
-
0
-

#11 KIIV
Tak nevím co dělám špatně.. Zkusila jsem to napsat podle toho, co jsi mi poradil ale nepíše mi tu mezeru nikde...

  char c;
       //je bily znak
    int byl_whiteSpace=1;
     while (!feof(soubor1))
    {
        fscanf(soubor1, "%c",&c);
        //byl whiteSpace
        if(isspace(c))
        {
            if(byl_whiteSpace==0)
            {
                fprintf(soubor2, " ");
                byl_whiteSpace=1;
            }
            //nebyl whiteSpace
        }else fprintf(soubor2, "%c",c);
    if(c=='.') fprintf(soubor2, "\n");
Nahlásit jako SPAM
IP: 90.178.161.–
zlz
~ Anonymní uživatel
634 příspěvků
9. 12. 2012   #14
-
0
-

Vypisuješ mezeru, když byl_whiteSpace==0, ale nikdy se nenastaví na 0.

Nahlásit jako SPAM
IP: 80.188.216.–
Hanule
~ Anonymní uživatel
37 příspěvků
9. 12. 2012   #15
-
0
-

#14 zlz
Tak předtím mi to nepsali mezery, teď mi je to vypisuje zase vsude (nanahradi mi tu posloupnost), takže jsem to asi špatně pochopila.

       char c;
       //je bily znak
    int byl_whiteSpace=1;
     while (!feof(soubor1))
    { //nacte znak ze souboru
        fscanf(soubor1, "%c",&c);
        //najde whiteSpace
        if(isspace(c)) {
            byl_whiteSpace=0;
            //overi, jestli byl_whiteSpace je 0
            if(byl_whiteSpace==0)
            fprintf(soubor2, " ");

            //nebyl whiteSpace
        }else fprintf(soubor2, "%c",c);
        //nasel tecku, tak odradkuje
    if(c=='.') fprintf(soubor2, "\n");


    }
Nahlásit jako SPAM
IP: 90.178.161.–
zlz
~ Anonymní uživatel
634 příspěvků
9. 12. 2012   #16
-
0
-

Tak předtím byl_whiteSpace měl pořád hodnotu 1, takže podmínka nebyla splněna nikdy. Teď má pořád hodnotu 0, takže je ta podmínka splněna vždy.

Musíš tam dodělat tu logiku, že z každé řady whitespace se první vypíše jako mezera a další v řadě se ignorují. Tzn. ten byl_whiteSpace podle potřeby přepínat. Nebo to řešit jinak.

Nahlásit jako SPAM
IP: 80.188.216.–
Hanule
~ Anonymní uživatel
37 příspěvků
9. 12. 2012   #17
-
0
-

#16 zlz
Tak jsem to nějak vyřešila, ale mám tam problém s podmínkou. Protože takto to nahradí posloupnost, kde se nachází 2 a víc ebílých znaků. Ale pokud dám podmínku >=2, tak to nefunguje pro nahrazení dvou znaků jednou mezerou.

 char c;
    //pocita pocet bilych znaku za sebou
    int whiteSpace=0;
    while (!feof(soubor1))
    {
        //nacte znak ze souboru
        fscanf(soubor1, "%c",&c);
        //neni bily znak
        if(!isspace(c))
        {
            //nasel tecku, tak odradkuje
            if(c=='.')
            {
                fprintf(soubor2, ".\n");
                            }
            //nebyl whiteSpace ani tecka - vypise znak
            else fprintf(soubor2, "%c",c);
        }
        //je bily znak, zvysi hodnotu
        else whiteSpace++;
        //pocet bilych znaku vedle sebe
        if(whiteSpace>2)
        {
            fprintf(soubor2, " ");
            whiteSpace=0;

        }

Nenapadá vás, jak to ošetřit?

Nahlásit jako SPAM
IP: 93.181.80.–
zlz
~ Anonymní uživatel
634 příspěvků
9. 12. 2012   #18
-
0
-

To počitadlo bych nuloval až ta řada whitespace skončí, v tom bloku !isspace.

Co se týče nahrazení, tak to můžeš udělat na začátku řady (isspace) - zapsat mezeru při whiteSpace == 1 a další ignorovat; nebo na konci řady (!isspace) - vypsat mezeru pokud je whiteSpace > 0.

Snad to dává smysl, už mi to moc nemyslí. Nakonec je jedno, kolik těch mezer bylo, ale s tím počitadlem to budeš mít originální. Tady jsme to řešili nedávno:

http://programujte.com/forum/vlakno/22771-formatovani-textu-ze-souboru-do-souboru/

Nahlásit jako SPAM
IP: 80.188.216.–
zlz
~ Anonymní uživatel
634 příspěvků
9. 12. 2012   #19
-
0
-

Tak třeba takhle, ať to nemáte moc podobné. Porovnávání s předchozím znakem.

char c, old = ' ';
while (!feof(soubor1))
{
	fscanf(soubor1, "%c", &c);

	if (!isspace(c))
	{
		fprintf(soubor2, "%c", c);
		if (c == '.')
			fprintf(soubor2, "\n");
	}
	else //isspace
	{
		if (old != '.' && !isspace(old))
			fprintf(soubor2, " ");
	}

	old = c;
}
Nahlásit jako SPAM
IP: 80.188.216.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 11 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý