usuwanie liter z tekstu

damcios
Użytkownik
Użytkownik
Posty: 341
Rejestracja: 3 lis 2008, o 19:55
Płeć: Mężczyzna
Lokalizacja: poznań
Podziękował: 1 raz

usuwanie liter z tekstu

Post autor: damcios »

Kod: Zaznacz cały

    string name,s;
	
ifstream plik("dfg.txt");
while (!plik.eof()){
for (int i=1 ;i<=3;++i){
getline (plik,name);

x=name.length();


if(x%3!=0){
for (int i=0;i<=x;){
name.erase(2*i,1);
s=name[i++];
}
cout<<s;
}

}}
plik.close();
getch();
return 0;
system("PAUSE");
return EXIT_SUCCESS;
} 
konsola odpala się i wyskakuje błąd, związany chyba z pamięcią, on ma usuwać litery nieparzyste.
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

usuwanie liter z tekstu

Post autor: soku11 »

Po co wszystko wrzucać w jedną nieczytelną funkcję. Nie chce mi się w ogóle tego analizować, bo robisz strasznie dziwne rzeczy. Dzielenie modulo przez 3? Iterowanie do długość stringa włącznie? Iterowanie bez iteratorów przy usuwaniu?
Do usuwania liter wystarczy użyć np. czegoś takiego:

Kod: Zaznacz cały

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <string>
#include <sstream>
using namespace std;

string removeOddChars(const string& text)
{
	ostringstream stream;
	for(size_t i = 0; i < text.size(); ++i)
	{
		if(i % 2 == 0)
		{
			stream << text[i];
		}
	}

	return stream.str();
}

char randomChar()
{
	return rand() % ('z' - 'a' + 1) + 'a';
}

int main()
{
	srand(static_cast<unsigned int> (time(NULL)));

	for(int i = 0; i < 20; ++i)
	{
		ostringstream buffer;
		for(int j = 0; j < i; ++j)
		{
			buffer << randomChar();
		}
		const string word = buffer.str();
		cout << word << ": " << removeOddChars(word) << "\n";
	}

	return EXIT_SUCCESS;
}

Krótkie, sprawdzone i działa tak jak trzeba. Rozwiązuj problemy po jednym, a nie wszystko naraz.
damcios
Użytkownik
Użytkownik
Posty: 341
Rejestracja: 3 lis 2008, o 19:55
Płeć: Mężczyzna
Lokalizacja: poznań
Podziękował: 1 raz

usuwanie liter z tekstu

Post autor: damcios »

dobra, ale mój sposób nie jest zły , pomóż mi wybrnąć z tego i wszystko będzie mi działało

Kod: Zaznacz cały

for(i=0;i<dlugosc&&i%2!=0;++i){
slowo.erase(i,1);}
dlaczego nie chce mi usuwać
slowo to jest string
norwimaj
Użytkownik
Użytkownik
Posty: 5101
Rejestracja: 11 mar 2011, o 16:31
Płeć: Mężczyzna
Lokalizacja: 52°16'37''N 20°52'45''E
Podziękował: 4 razy
Pomógł: 1001 razy

usuwanie liter z tekstu

Post autor: norwimaj »

A co ten program ma robić?

Czemu ma służyć pętla z linii 5 i jak się ma zachować program, jeśli liczba linii w pliku wejściowym nie jest podzielna przez 3?

Co do tego:
damcios pisze:dobra, ale mój sposób nie jest zły , pomóż mi wybrnąć z tego i wszystko będzie mi działało

Kod: Zaznacz cały

for(i=0;i<dlugosc&&i%2!=0;++i){
slowo.erase(i,1);}
dlaczego nie chce mi usuwać
slowo to jest string
Co to ma robić? Chcesz usunąć litery, których indeksy dają resztę 1 przy dzieleniu przez 3? W miarę usuwania kolejnych liter zmniejsza się długość napisu i dlatego wychodzisz poza zakres. Musisz albo za każdym razem odczytywać długość, albo od razu przewidzieć, jaka będzie długość po wyrzuceniu liter. Jeśli już koniecznie chcesz to robić w taki sposób, to wygodniej Ci będzie te litery usuwać od końca.
damcios
Użytkownik
Użytkownik
Posty: 341
Rejestracja: 3 lis 2008, o 19:55
Płeć: Mężczyzna
Lokalizacja: poznań
Podziękował: 1 raz

usuwanie liter z tekstu

Post autor: damcios »

jakie indeksy, jeśl chodzi o zmienną i , to ma tak to wyglądać
jeżeli numer litery jest mniejszy od długości (i<dlugość) i jest nieparzysty(i%2!=0) to ma ją usunąć.
tam jeszcze się pytałeś o linie, to chodzi żeby liczba liter w lini była parzysta bądź nie, a nie numer lini
norwimaj
Użytkownik
Użytkownik
Posty: 5101
Rejestracja: 11 mar 2011, o 16:31
Płeć: Mężczyzna
Lokalizacja: 52°16'37''N 20°52'45''E
Podziękował: 4 razy
Pomógł: 1001 razy

usuwanie liter z tekstu

Post autor: norwimaj »

Prześledźmy wykonanie dla słowa "012345". Wtedy dlugosc=6.

i=0: nic nie robimy.

i=1: "02345"

i=2: nic nie robimy.

i=3: "0235"

i=4: nic nie robimy

i=5: Błąd! Nie ma w napisie "0235" znaku o indeksie 5.


Poza tym dziwnie piszesz. Jeśli chcesz zrobić coś dla wszystkich naturalnych liczb nieparzystych mniejszych od dlugosc, to możesz napisać

Kod: Zaznacz cały

for (int i=1; i<dlugosc; i+=2) rób coś
Korzystamy tu ze wzoru rekurencyjnego na kolejne naturalne liczby nieparzyste. \(\displaystyle{ a_1=1}\), \(\displaystyle{ a_{n+1}=a_n+2}\).
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

usuwanie liter z tekstu

Post autor: soku11 »

Jak się koniecznie uprałeś na wersję z erase, to zadziała tylko taka wersja:

Kod: Zaznacz cały

string removeOddChars(const string& text)
{
	string result(text);
	string::iterator iter = result.begin();
	unsigned int counter = 0;
	while(iter != result.end())
	{
		if(counter % 2 != 0)
		{
			iter = result.erase(iter);
		}
		else
		{
			++iter;
		}

		++counter;
	}

	return result;
}
damcios
Użytkownik
Użytkownik
Posty: 341
Rejestracja: 3 lis 2008, o 19:55
Płeć: Mężczyzna
Lokalizacja: poznań
Podziękował: 1 raz

usuwanie liter z tekstu

Post autor: damcios »

już zrobiłem to na tablicy stringów, dużo prościej, a ten sam efekt. Juz ostatnie moje pytanie, jak zrobić, żeby program wyszukał w pliku najdłuższe słowo złożone z tej samej litery???
ja to myślałem żeby tak to zrobić, słowo wczytać przez plik.get(), zapisać do tablicy charów, porównać w pętli tbl = tbl[i++], i wtedy na stringa i zmierzyć długość
ODPOWIEDZ