[C++] Usuwanie komentarzy
Ostatnio zmodyfikowano 2014-01-10 15:42
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 /* */ |
|
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. |
|
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 ? #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 ); 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 ); bool komentarz = 0; int t; while( !pr.eof() ) { 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] |
|
alixir |
» 2014-01-10 14:21:36 while( !pr.eof() ) { 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. |
|
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 |
|
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. #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 ); 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 ); 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() ) { 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; }
|
|
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. // )
|
|
1 « 2 » |