0

Got a program code so far to:

#include <string>
#include <fstream>
#include <iomanip>
#include <iostream>

using namespace std;
//----------------------------------------------------------------------------
const char Cdat[] = "Data.txt";
const char Crez[] = "Rezult.txt";
const char Canalyzis[] = "Analyzis.txt";

//----------------------------------------------------------------------------
void TrimmText(const char dfv[], const char rfv[], const char afv[]);
void AnalyzeLine(string &lin, string & TwoNumeral, int & TwoStart,
					  unsigned int & TwoSum);
void EditLine(string &lin, int TwoStart, int TwoSum);

int main()
{
	TrimmText(Cdat, Crez, Canalyzis);
}
//----------------------------------------------------------------------------
// Text reading by line
// dfv - original text data file name, rfv - edited text data file name
// afv - analyzis data file name
void TrimmText(const char dfv[], const char rfv[], const char afv[])
{
	string TwoNumeral;
	int TwoStart;
	unsigned int TwoSum;
	ifstream fd(dfv);
	ofstream fr(rfv);
	ofstream fa(afv);
	string L;
	fa << "---------------------------\n";
	fa << "| Word | Start |  Sum |\n";
	fa << "---------------------------\n";
	while(!fd.eof()) 
	{
		getline (fd, L);
		{
			AnalyzeLine(L, TwoNumeral, TwoStart, TwoSum);
			fr << L << endl;
			if (TwoSum <= 9 && TwoSum != 0) 
			{
				fa << "| " << left << setw(5) << TwoNumeral << " | "
					<< right << setw(7) << TwoStart;
				fa << " | " << setw(5) << TwoSum << " |\n";
			}
		}
	}
	fa << "---------------------------\n" << endl;
	fd.close();
	fd.close();
	fa.close();
}
//----------------------------------------------------------------------------
// Function which finds words that are made of two numerals and its sum
// lin - line, in which search is being made
// TwoNumeral - word which is made of two numerals
// TwoStart - return its start
// TwoSum - returns its numerals sum
void AnalyzeLine(string &lin, string & TwoNumeral, int & TwoStart, unsigned int & TwoSum)
{
	string Skirt = " .,!?:;()\t";
	string Numbers = "0123456789";
	string Word;
	int zpr = 0, zpb = 0;
	int skaiciukai[2];
	char skirstymas[2];
	TwoNumeral = "";
	TwoStart = 0; TwoSum = 0;
	while ((zpr = lin.find_first_not_of(Skirt, zpb)) != string::npos) 
	{
		zpb = lin.find_first_of(Skirt, zpr);
		Word = lin.substr(zpr, zpb - zpr);
		if(Word.length()==2 && !Word.find_first_of(Numbers,0))
		{
			TwoNumeral = Word;
			TwoStart = zpr;
			skirstymas[0]=Word[0];
			skirstymas[1]=Word[1];
			char sk1=skirstymas[0];
			char sk2=skirstymas[1];
			skaiciukai[0]=atoi(&sk1);
			skaiciukai[1]=atoi(&sk2);
			TwoSum = skaiciukai[0]+skaiciukai[1];
			if (TwoSum <= 9 && TwoSum != 0)
			{
				EditLine(lin, TwoStart, TwoSum);
			}
		}
	}
}
//----------------------------------------------------------------------------
// function which deletes words that are made of two numerals and which sum is less or equal to 9
// lin - line, which is being changed
// TwoStart - the start of word made of two numerals

void EditLine(string & lin, int TwoStart, int TwoSum)
{
	string Numbers = "0123456789";
	if (Numbers.find_first_of(lin[TwoStart]) != string::npos) 
		{
			lin.erase(TwoStart, 2);
		}
}

I need it to delete words that are made of two numerals and which sum is less or equal to 9. (basicaly if its 18/15/71 it deletes that word, if its 91 it wont because its more than 9). Think im pretty much done getting program to do so, theres a problem - If there's more than 1 word that meets my criteria in single line, program returns only last word from that line to analyzis.txt while i need it to return every single one of it.. Any ideas?

Heres data file example:

Ne vieno antikos 18 autorių veikaluose 17 esama likę 567 nupasakojimų,
 kaip kvapiosios substancijos keliavo 1900 mylių aplink Viduržemio jūrą.
 
        ****  14  12  13 99 125 ***
 
  Iš šių 105 įvairių aprašymų matyti, jog Egiptas, ypač faraonų laikais,
  
  
   05 labai daug *** 76 kvapiųjų substancijų (kai kurių nūdienos  10 archeologų

 skaičiavimais gal net  **** 80 %) 01 atsigabendavo iš tolimų ir ne tokių  tolimų kraštų: iš Arabijos, iš Viduržemio jūros 
 55 salų – Kipro, Chijo ir Kretos, iš Nilo aukštupio. 
 Ypač 333 kvepalų importas 22 Egipte suklestėjo XIII a. pr. m. e, kai šalį valdė Ramzis Didysis.

Rezults file:

Ne vieno antikos  autorių veikaluose  esama likę 567 nupasakojimų,
 kaip kvapiosios substancijos keliavo 1900 mylių aplink Viduržemio jūrą.
 
        ****       99 125 ***
 
  Iš šių 105 įvairių aprašymų matyti, jog Egiptas, ypač faraonų laikais,
  
  
    labai daug *** 76 kvapiųjų substancijų (kai kurių nūdienos   archeologų

 skaičiavimais gal net  ****  %)  atsigabendavo iš tolimų ir ne tokių  tolimų kraštų: iš Arabijos, iš Viduržemio jūros 
 55 salų – Kipro, Chijo ir Kretos, iš Nilo aukštupio. 
 Ypač 333 kvepalų importas  Egipte suklestėjo XIII a. pr. m. e, kai šalį valdė Ramzis Didysis.

Analyzis file:

---------------------------
| Word | Start |  Sum |
---------------------------
| 17    |      37 |     8 |
| 25    |      24 |     7 |
| 10    |      64 |     1 |
| 01    |      33 |     1 |
| 22    |      27 |     4 |
---------------------------

also if i put 01 in front of 125 in data file, I get **** 99 1 *** in rezults file which shouldnt happen.

2
Contributors
4
Replies
5
Views
5 Years
Discussion Span
Last Post by vlaskiz
0

77 eiluteje !Word.find_first_of(Numbers,0)) ar neturetu buti != string::npos ?
beje c++ standarte yra biblioteka vadinama cctype kurioje rasi funkcija std::isdigit

0

Na nezinau, tuomet dar maziau rezultatu grazina i analizes faila, o del std::isdigit tai abejoju ar kazka tokio 'sudetingo' man reikia kisti i sia programa

0

38 eiluteje yra tavo klaida,kiek prisimenu sios eof() funckcijos negalima naudoti cikle, geriau naudok sia funkcija good() arba while(getline (fd, L))

0

Jo sita jau supratau ir pataisiau, taciau vistiek man i analizes faila grazina is tos pacios eilutes tik paskutini zodi kuris atitinka kriterijus,

This topic has been dead for over six months. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.