Zamiana wyrazów w tekście

0

Witam,
pisalem wczesniej podobnego posta o szukaniu programu(ktory moglby w danym tekscie wyszukac konkretne slowa i zamienic je na inne), teraz sam sie za to wzialem, skorzystalem z google i roznych for i napisalem cos takiego:

#include "stdafx.h"
#include <stdio.h>
#include <string>
#include <fstream>
#include <iostream>


int i=0;
char words[20];
char change[20];
int main()
{
	using namespace std;
   fstream file;
   file.open("c:\tekst.txt");
   if (!file.is_open() )
   {
       cout << "nie ma takiego pliku\n";
	   exit(EXIT_FAILURE);
   }
	cout << "Ile wyrazow chcesz zamienic?";
	int n;
	cin>> n;
	for (i=0; i<n; i++)
	{
		cout<<  "Podaj" << i+1<<"-y wyraz";
		cin >> words[i];
		printf ("Na co ma zostac zamieniony?");
		cin >> change[i];

   char wyrazWpliku;
   while(file.good() )
   { 
       file >> wyrazWpliku;
       if (wyrazWpliku==words[i])
		   cout << "zamieniam \t";
	   wyrazWpliku=change[i];
   }
   file.close();
    
}
	return 0;
}

aleee wylacza sie zaraz po wprowadzeniu wyrazu ktory ma zostaw zamieniony;/ dlaczego? druga sprawa jak moge sprawic aby omijal komentarze? tzn jesli bede mial // to ominie cala linijke, jesli /* to ominie wszystko do konca komentarza
korzystam z visual c++ 2005 express

P.S. prosze sie nade mna nie pastwic wytykajac bledy i wysmiewajac kod:) znam tylko podstawy c++ i jakos nie jest on moja mocna strona

0
  1. \t to jest tabulator, wiec jeśli program ci mówi, że nie może znaleźć pliku "c: ekst.txt", to ma rację.

  2. Ten program nie ma szans zadziałać. Nie zapisujesz zamienionych wyrazów z powrotem do pliku.

  3. Zrób sobie dodatkowe dwie zmienne typu bool, w których będziesz miał informacje czy aktualnie znajdujesz się w komentarzu jednolinijkowym, wielolinijkowym czy poza komentarzem. Wtedy gry napotkasz // albo /* to ustawiasz odpowiednią zmienną na true oraz przestajesz zamieniać wyrazy. I tak aż do napotkania końca komentarza, wtedy zmienne na false i jedziesz dalej po staremu.

PS. Średnio widzę twój sposób rozwiązania problemu. 10x łatwiej byłoby to zrobić wyrażeniami regularnymi.

P.S. prosze sie nade mna nie pastwic wytykajac bledy i wysmiewajac kod:)

Pastwię się nad błędami, nie nad tobą, więc nie bierz sobie tego za bardzo do serca :)

0

ok, faktycznie zmienilem i plik juz znajduje:) wiem juz tez ze nie moge pisac char words[20] bo bedzie to jedno slowo a nie tablica;/ moge zmienic char na string ale wtedy mi sie kompilator burzy i jest po zabawie;/

Kicok napisał(a)

PS. Średnio widzę twój sposób rozwiązania problemu. 10x łatwiej byłoby to zrobić wyrażeniami regularnymi.

Zrobilem jak umialem;/ wiem ze nie jest to najlepszy sposob ale coz poradzic:) no i lepiej samemu cos sprobowac niz marudzic o gotowy kod ;-P

0

Ok, więc tak - są dwie metody na zrobienie takiej prostej zamiany wyrazów:
a) Pobierasz wyrazy do zamiany od użytkownika i zapisujesz je w tablicy albo wektorze. Potem przelatujesz raz pętlą po wszystkich wyrazach pliku i dla każdego wyrazu sprawdzasz (wewnętrzna pętlą), czy nie trzeba go zamienić.
b) Pobierasz w pętli wyrazy do zamiany od użytkownika i od razu przelatujesz od nowa (wewnętrzną pętlą) po całym pliku sprawdzając, czy nie trzeba czegoś zmienić.

Pierwszy sposób to łatwa zamiana wyrazów w pliku (wykonujesz to tylko raz), ale musisz pobrać i przechowywać wszystkie wyrazy do zamiany od użytkownika.
W drugim sposobie nic nie musisz przechowywać, wystarczy jedna zmienna string albo char[100], ale dla każdego podanego przez użytkownika wyrazu od nowa musisz otworzyć plik, przeszukać go i zapisać.

Ty aktualnie masz taki miks tych sposobów :)

I teraz tak, jeśli będziesz chciał przechowywać wyrazy podane przez użytkownika to

  • dynamiczna tablica stringów LUB
  • dynamiczna dwuwymiarowa tablica char LUB NAJPROŚCIEJ
  • wektor ( http://www.cplusplus.com/reference/stl/vector/push_back/ dodajesz elementy przez push_back(), pobierasz tak jak w tablicy, typ danych na których chcesz operować podajesz w nawiasach ostrych, nie zapomnij o #include <vector>)

Natomiast edytowanie pliku powinno wyglądać tak:
otwarcie pliku do odczytu - tekst.txt
otwarcie pliku do zapisu - tekst.TMP
wczytywanie wyrazów z pliku TXT i zapisywanie do pliku TMP:

  • tego samego wyrazu jeśli nic nie trzeba zmieniać LUB
  • zamienionego wyrazu
    zamknięcie pliku TXT
    zamknięcie pliku TMP
    usunięcie pliku TXT
    zmiana nazwy pliku "tekst.TMP" na "tekst.txt"

Z pomocą google powinieneś dać sobie radę. Za komentarze na razie się nie bierz.

0

troche to trwalo ale cos wymodzilem, niestety dalej nie dziala;/ tzn zamienia badz przepisuje tylko pierwszego stringa z pliku:( nie wiedzialem jak usuwac pliki wiec mam po prostu dwa pliki tekstowe:)
a oto jak wyglada ten ekhm "program"

#include "stdafx.h"
#include <stdio.h>
#include <string>
#include <fstream>
#include <iostream>
#include <vector>
   using namespace std;
int i=0;
int main()
{
	
	vector<string> words;
	vector<string> change;
	string mystring;
	string mystring1;

   ifstream file;
   ofstream file1;
   file.open("tekst.txt", ios::out);
   file1.open("zmieniony_tekst.txt", ios::in);
   if (!file.is_open() )
   {
       cout << "nie ma takiego pliku\n";

	   exit(EXIT_FAILURE);
   }
	cout << "Ile wyrazow chcesz zamienic?\n";
	int n;
	cin>> n;
	for (i=0; i<n; i++)
	{
		cout << "Podaj" << i+1<<"-y wyraz\n";
		cin >> mystring;
		words.push_back (mystring);
		cout << "Na co ma zostac zamieniony?\n";
		cin >> mystring1;
		change.push_back (mystring1);  
	}
	string wyrazWpliku;
	i=0;
	while(!file.eof() )
   { 
	   while(i<n)
	   {
       file >> wyrazWpliku;
       if (wyrazWpliku==words[i])
			{
		    cout << "zamieniam\n";
			wyrazWpliku=change[i];
			cout << wyrazWpliku;
			system("pause");
			}
	   i++;
	   file1 << wyrazWpliku;	   
	   }

   }
   file.close();
   file1.close();
	return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1