Program szukający roku w pliku

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

#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;
}
0

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

cat plik.txt | tr -s '' | cut -d " " -f3
0
if (t[i].find("20") != string::npos){
            t2[j]=t[i];

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

1

Dlaczego nie korzystasz z std::vector?

1

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

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

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