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

[C++] Usuwanie komentarzy

Ostatnio zmodyfikowano 2014-01-10 15:42
Autor Wiadomość
patoxd
Temat założony przez niniejszego użytkownika
» 2014-01-10 13:24:24
Działa, tylko usuwa całość, razem ze znakiem komentarza // lub /* */
P-101751
alixir
» 2014-01-10 13:26:22
A nie tak miało działać?
Ogólnie jeśli chcesz zostawić te znaki to wprowadzasz prostą modyfikację. Dodajesz lub odejmujesz 2 w metodzie erase.
P-101752
patoxd
Temat założony przez niniejszego użytkownika
» 2014-01-10 13:33:09
Chciałbym jednak działać na tym kodzie co napisałem, bo najbardziej go wtedy rozumiem i jest mi się łatwiej nauczyć. Dałbyś radę zmodyfikować ten mój, tak żeby działał poprawnie ?
C/C++
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main()
{
    string wiersz;
   
    char nazwaPliku[ 100 ];
    cout << "Podaj nazwe pliku do otwarcia: " << endl;
    cin >> nazwaPliku;
   
    char nazwaPliku1[ 100 ];
    cout << "Podaj nazwe pliku pod jaka zapisac zmieniony plik: " << endl;
    cin >> nazwaPliku1;
   
    ifstream pr( nazwaPliku, std::ios::in ); //odczyt z pliku
   
    if( !pr )
    {
        cout << "Plik nie zostal otwarty." << endl;
        return 1;
    }
   
    char znak;
    cout << "Podaj znak jakim chcesz zastapic znaki komentarza: " << endl;
    cin >> znak;
   
    ofstream plik2( nazwaPliku1 ); //zapis do pliku
    bool komentarz = 0;
    int t;
   
    while( !pr.eof() ) //czytanie do momentu osiagniecia konca pliku
    {
        getline( pr, wiersz );
        t = wiersz.length();
        for( int i = 0; i < t; i++ )
        {
            if( wiersz[ i ] == '/' && wiersz[ i + 1 ] == '/' )
            {
                for( int i = 0; i < t; ++i )
                {
                    wiersz[ i ] = znak;
                }
            }
           
           
           
            for( int j = 0; j < t; j++ )
            {
                if( wiersz[ j ] == '/' && wiersz[ j + 1 ] == '*' )
                {
                    komentarz = 1;
                    ++j;
                }
                if( wiersz[ j ] == '*' && wiersz[ j + 1 ] == '/' )
                     komentarz = 0;
               
                if( komentarz == 1 )
                     wiersz[ j ] = znak;
               
            }
           
        }
       
       
        plik2 << wiersz << endl;
    }
   
    pr.close();
    plik2.close();
    return 0;
}
Problem jest tylko z komentarzem typu //tekstteksttekst[/i]
P-101753
alixir
» 2014-01-10 14:21:36
C/C++
while( !pr.eof() ) //czytanie do momentu osiagniecia konca pliku
{
    getline( pr, wiersz );
    t = wiersz.length();
    for( int i = 0; i < t - 1; i++ ) {
       
        if( wiersz[ i ] == '/' && wiersz[ i + 1 ] == '/' ) {
            for( int l = i + 2; l < t; l++ ) {
                wiersz[ l ] = znak;
            }
            break;
        }
       
        if( wiersz[ i ] == '/' && wiersz[ i + 1 ] == '*' ) {
            for( int l = i + 2; l < t; l++ ) {
                wiersz[ l ] = znak;
            }
            komentarz = true;
            break;
        }
       
        if( wiersz[ i ] == '*' && wiersz[ i + 1 ] == '/' ) {
            for( int l = 0; l < i; l++ ) {
                wiersz[ l ] = znak;
            }
            komentarz = false;
        }
       
        if( komentarz == true ) {
            for( int l = 0; l < i; l++ ) {
                wiersz[ l ] = znak;
            }
        }
       
    }
   
    plik2 << wiersz << endl;
}

Oba podane przeze mnie przykłady maja tę samą wadę. Mianowicie komentarz rozpoczynający się od /* musi kończyć się przynajmniej jedną linię niżej.  
P-101756
patoxd
Temat założony przez niniejszego użytkownika
» 2014-01-10 14:32:25
Skopiowalem kod do DevCpp 5.5 tym razem i nadal to samo.. zamienia cały kod, a nie tylko komentarze
P-101758
alixir
» 2014-01-10 14:37:10
U mnie na VC++ śmiga i nie mogę doszukać się błędu (no ale też nie jestem zbyt dobry w te klocki). Może ktoś inny coś wymyśli.

Dla pewności wklejam pełny kod program.

C/C++
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main()
{
   
    char nazwaPliku[ 100 ];
    cout << "Podaj nazwe pliku do otwarcia: " << endl;
    cin >> nazwaPliku;
   
    ifstream pr( nazwaPliku ); //odczyt z pliku
    if( !pr.good() ) {
        cout << "Plik nie zostal otwarty." << endl;
        return 1;
    }
   
    char nazwaPliku1[ 100 ];
    cout << "Podaj nazwe pliku pod jaka zapisac zmieniony plik: " << endl;
    cin >> nazwaPliku1;
   
    ofstream plik2( nazwaPliku1, std::ios::out ); //zapis do pliku
    if( !pr.good() ) {
        cout << "Plik2 nie zostal otwarty." << endl;
        return 1;
    }
   
    char znak;
    cout << "Podaj znak jakim chcesz zastapic znaki komentarza: " << endl;
    cin >> znak;
   
    string wiersz;
    bool komentarz = false;
    int t;
   
    while( !pr.eof() ) //czytanie do momentu osiagniecia konca pliku
    {
        getline( pr, wiersz );
        t = wiersz.length();
        for( int i = 0; i < t - 1; i++ ) {
           
            if( wiersz[ i ] == '/' && wiersz[ i + 1 ] == '/' ) {
                for( int l = i + 2; l < t; l++ ) {
                    wiersz[ l ] = znak;
                }
                break;
            }
           
            if( wiersz[ i ] == '/' && wiersz[ i + 1 ] == '*' ) {
                for( int l = i + 2; l < t; l++ ) {
                    wiersz[ l ] = znak;
                }
                komentarz = true;
                break;
            }
           
            if( wiersz[ i ] == '*' && wiersz[ i + 1 ] == '/' ) {
                for( int l = 0; l < i; l++ ) {
                    wiersz[ l ] = znak;
                }
                komentarz = false;
            }
           
            if( komentarz == true ) {
                for( int l = 0; l < i; l++ ) {
                    wiersz[ l ] = znak;
                }
            }
           
        }
       
        plik2 << wiersz << endl;
    }
   
    pr.close();
    plik2.close();
   
    return 0;
}
P-101759
00Andre
» 2014-01-10 15:42:45
Według mnie lepiej było wyczytać wszystkie linie wyczytane z pliku do vectora <string> a potem zrobić petlę która przechodziła przez vector i szukała "//" "/*" "*/" potem usunąć za pomocą funkcją erase (2, długość Lini - 2)( I zostaje sam znak komentarza np. // )
P-101764
1 « 2 »
Poprzednia strona Strona 2 z 2