Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

C Parsowanie tekstu, omijanie tekstu w komentarzach

Ostatnio zmodyfikowano 2013-11-13 12:51
Autor Wiadomość
mors
Temat założony przez niniejszego użytkownika
C Parsowanie tekstu, omijanie tekstu w komentarzach
» 2013-11-13 01:01:42
Witajcie, mam program, ale nie działa on jeszcze dostatecznie dobrze.
Pozwólcie, że napisze polecenie.
Napisz program, który przekształci zadany plik tekstowy w drugi plik wg podanych
ponizej zasad:
_ Wszystkie litery duze nalezy zamienic na małe.
_ Wszystkie znaki przestankowe (tzn. nie bedace literami, cyframi ani znakami
białymi)
nalezy zamienic na kropke.
_ Wszystkie cyfry nalezy zamienic na ”0”.
_ Dodatkowo nalezy opuscic tekst znajdujacy sie wewnatrz komentarza, tzn.
wewnatrz
znaków /* ... */. Komentarze moga byc zagłebione. Mozesz załozyc, ze sa one w
tekscie uzyte poprawnie.
Dodatkowo program zlicza liczbe linii pliku wyjsciowego, które zawieraja co najmniej
jeden znak (litere,’0’ lub ’.’). Liczbe te nalezy wypisac na standardowe wyjscie.
Program powinien byc uruchamiany z dwoma parametrami: nazwa analizowanego
pliku oraz nazwa pliku, w którym nalezy zapisac wynik. Jesli plik wejsciowy nie istnieje i/lub nie otworzył sie poprawnie, nalezy zgłosic bład.

Dla pliku zawierajacego tekst:
1.Kon Trojanski, 2.Krowa Trojoka;
3. Malownicza-Marchewka--/* kredka w ksztalcie marchewki */-4. Sciorany kot /*
gumka w ksztalcie kota */
Kim jestes Ty, /* /* zaglebiony komentarz */ */ stojacy nad przepascia!?
Liczba mieszkancow Krakowa /w roku 2009/: "754 854".
Pewnego dnia Puchatek wyszedl na spacer,/* az zaszedl na polane w srodku lasu,
/* a posrodku tej polanki rosl wielki dab
i z samego jego wierzcholka dochodzilo glosne bzykanie.*/ Kubus Puchatek
usiadl sobie pod tym debem, */ podparl glowe na lapkach i zaczal rozmyslac.
Poprawna odpowiedzia jest:
5
oraz plik:
0.kon trojanski. 0.krowa trojoka.
0. malownicza.marchewka...0. sciorany kot
kim jestes ty. stojacy nad przepascia..
liczba mieszkancow krakowa .w roku 0000.. .000 000..
pewnego dnia puchatek wyszedl na spacer. podparl glowe na lapkach i zaczal rozmyslac.

Mój wynik:
0.kon trojanski. 0.krowa trojoka.

0. malownicza.marchewka....0. sciorany kot  . . . stojacy nad przepascia..

liczba mieszkancow krakowa w roku 0000. .000 000..

pewnego dnia puchatek wyszedl na spacer.

Kod:
C/C++
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

void change( char * in, char * out )
{
    FILE * fIn;
    FILE * fO;
    int koment = 0;
    fO = fopen( out, "w+" );
   
    char c, c2;
    if(( fIn = fopen( in, "r" ) ) != NULL )
    {
        while( !feof( fIn ) )
        {
            c = fgetc( fIn );
            if( c == '/' )
            {
                c2 = fgetc( fIn );
                if( c2 == '*' ) koment++;
                else ungetc( c2, fIn );
               
                continue;
            }
            if( koment >= 1 )
            {
                c2 = fgetc( fIn );
                if( c != '*' && c2 != '/' ) continue;
                else
                {
                    koment--;
                    if( koment > 0 ) continue;
                   
                }
            }
            if( c == ',' || c == ';' || c == '?' || c == ':' || c == '!' || c == '-' || c == '*' || c == '"' )
            {
                fprintf( fO, "%c", '.' );
                continue;
            }
            if( c >= '0' && c <= '9' )
            {
                fprintf( fO, "%c", '0' );
                continue;
            }
            if( isupper( c ) )
            {
                fprintf( fO, "%c", tolower( c ) );
                continue;
            }
            else
            {
                fprintf( fO, "%c", c );
                continue;
            }
           
           
        }
    }
    fclose( fIn );
    fclose( fO );
   
   
}
void liczLinijki( char * p )
{
    FILE * fO;
    int licznik = 0, i;
    char * line = malloc( sizeof( char ) * 250 );
    if(( fO = fopen( p, "r" ) ) != NULL )
    {
        while( !feof( fO ) )
        {
            fgets( line, 250, fO );
            for( i = 0; i < 250; i++ )
            {
                if( line[ i ] == '0' || line[ i ] == '.' ||( line[ i ] >= 'a' && line[ i ] <= 'z' ) )
                {
                    licznik++;
                    break;
                }
                else if( line[ i ] == '\n' ) break;
               
            }
           
        }
    }
    printf( "%d\n", licznik );
    fclose( fO );
}
int main( int c, char ** arg )
{
   
    if( c >= 3 )
    {
        change( arg[ 1 ], arg[ 2 ] );
        liczLinijki( arg[ 2 ] );
       
    }
    else printf( "Za malo argumentow!\n" );
   
    system( "pause" );
    return 0;
}



P-96165
DejaVu
» 2013-11-13 12:39:07
C/C++
if( c == '/' && koment == 0 )
/edit:
... komentarze mogą być zagłębione więc błędna podpowiedź ;p

Sprawdź debuggerem :)
P-96176
mors
Temat założony przez niniejszego użytkownika
» 2013-11-13 12:47:34
Sprawdzałem i nie pokazuje żadnych istotnych błędów.
P-96177
Monika90
» 2013-11-13 12:51:26
Zamiast sprawdzać debuggerem, lepiej przeczytaj dokumentację standardowej biblioteki C.

Pętla takiej postaci:
C/C++
char c;
while( !feof( fIn ) )
{
    c = fgetc( fIn );
    do_something_with( c );
}
jest błędna. Skąd to wziąłeś?

Funkcja fgetc zwraca int, a nie char i jest ku temu ważny powód...

Wywoływanie fclose z argumentem NULL też jest błędne.

Powinieneś też zliczać linie podczas zapisu do pliku, a nie otwierać go po raz drugi i wczytywać (zresztą nieprawidłowo).
P-96178
« 1 »
  Strona 1 z 1