Program szukający roku w pliku

Program szukający roku w pliku
PP
  • Rejestracja:około 6 lat
  • Ostatnio:prawie 5 lat
  • Postów:20
0

Mam podany plik w której pierwszy jest rozmiar(ilość linii)
następnie tekst w każdej linii tekst w postaci:
Jan Kowalski 2015
program ma zapisać do tablicy tylko "2015" itd a następnie zapisać do pliku
zrobiłem taki kod kompiluje się lecz nie działa i nie mogę znaleźć błędu

Kopiuj
#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>

using namespace std;

string *wczytaj(ifstream &plik, int &n){
	string linia;
	getline(plik, linia);
	n=atoi(linia.c_str());

	string* t= new string [n];
	for(int i=0; i<n; i++)
		plik>>t[i];

	return t;
}

string *znajdz(string* t, const int n, int &ilosc){
	ilosc=0;
	int j=0;

	for(int i=0; i<n; i++){
		if (t[i].find("20") != string::npos)
			ilosc++;
		}
	string *t2= new string[ilosc]; 
	for(int i=0; i<n; i++){
		if (t[i].find("20") != string::npos){
			t2[j]=t[i];
			j++;
		}
	}
	return t2;
	}
void  zapdopliku(ofstream &z, string*t, const int n){
		z<<n<<endl;
		for(int i=0; i<n ;i++)
		z<<t[i]<<endl;
}

int main()
{
    ifstream plik;
    plik.open("dane.txt");
    if(!plik.good()){
		cout<<"Blad na pliku!"<<endl;
		exit(-1);
	}

    ofstream zapisz;
    zapisz.open("zapisuje_dane.txt");
   
    int rozmiar=0, rozmiar2=0;
    string* tab=0;
    string* tab2=0;
    
    tab=wczytaj(plik, rozmiar);

	tab2=znajdz(tab, rozmiar, rozmiar2);
	cout<<rozmiar2<<endl;
	
	for(int i=0; i<rozmiar2; i++)
		cout<<tab2[i]<<endl;
	
	zapdopliku(zapisz, tab2, rozmiar2);

    plik.close();
    zapisz.close();
	
	if(tab!=0)
	delete []tab;
	if(tab!=0)
	delete []tab2;
    
    return 0;
}
edytowany 3x, ostatnio: PlotrekPL
obscurity
która część nie działa?
WhiteLightning
  • Rejestracja:prawie 14 lat
  • Ostatnio:15 minut
  • Postów:3183
0

A nie mialbys prosciej to np. w bashu zrobic? cos w stylu:

Kopiuj
cat plik.txt | tr -s '' | cut -d " " -f3
PP
zadanie robione specjalnie na około w celu nauki
Pyxis
Chyba prościej byłoby grep -oE [[:digit:]]\{1,}$ > years.
Delor
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 2 lata
0
Kopiuj
if (t[i].find("20") != string::npos){
            t2[j]=t[i];

Zapisujesz cały string zamiast szukanej części.

tajny_agent
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad rok
  • Postów:1340
1

Dlaczego nie korzystasz z std::vector?


"I love C++. It's the best language in the world right now for me to write the code that i need and want to write"
~ Herb Sutter
MarekR22
Moderator C/C++
  • Rejestracja:ponad 17 lat
  • Ostatnio:3 minuty
0

Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: MarekR22
tajny_agent
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad rok
  • Postów:1340
1

@PlotrekPL: Z tego co podałeś to tak po prawdzie to wcale nie musisz czytać pliku linia po linii.

Kopiuj
bool isValidYear(const string& str)
{
  int year;
  char* end = str.data() + str.length();
  if (auto [ptr, err] = from_chars(str.data(), end, year); err == errc{} && ptr == end) {  // 1
    return (year >= 1900 && year <= 2100); // 2
  }
  return false;
}

vector<string> extractYears(istream& source)
{
  if (int num; source >> num) {
    vector<string> years(num);
    copy_if(istream_iterator<string>{source}, istream_iterator<string>{}, years.begin(), [](const string& token){ return isValidYear(token); });  // 3
    return years;
  }
  return {}
}
  1. Sprawdza czy string da się skonwertować na liczbę (ptr == end eliminuje przypadek uznania np. 2014q za poprawną liczbę)
  2. Zakres lat oczywiście umowny
  3. Przelatuje cały plik i kopiuje do wektora tylko te fragmenty, które spełnią wymagania funkcji isValidYear

"I love C++. It's the best language in the world right now for me to write the code that i need and want to write"
~ Herb Sutter
PP
zadanie było z wykorzystaniem getline :/ dzięki za pomoc
tajny_agent
To w niczym nie przeszkadza. Możesz użyć getline a następnie do extractYears przesłać istringstream.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.