Search code examples
c++fstreamifstreamdirectoryofstream

How to get specific part of line in specific format in directories?


------------------------------------------------
          Artikli vo magacin za obleka          
------------------------------------------------
Vo magacinot ima vkupno 5 artikli
------------------------------------------------
Sifra : 3
Opis : opis2
Edinecna cena : 212
Vlezna kolicina : 2
Izlezna kolicina : 0
Danocna stapka : 0
Iznos : 424
Datum na vlez : 20324
------------------------------------------------
Sifra : 3
Opis : 54
Edinecna cena : 123
Vlezna kolicina : 12
Izlezna kolicina : 0
Danocna stapka : 0
Iznos : 1476
Datum na vlez : 120915
------------------------------------------------
Sifra : 3
Opis : opsi2
Edinecna cena : 12
Vlezna kolicina : 324
Izlezna kolicina : 0
Danocna stapka : 0
Iznos : 3888
Datum na vlez : 570509
------------------------------------------------
Sifra : 2
Opis : vopi
Edinecna cena : 2
Vlezna kolicina : 2
Izlezna kolicina : 0
Danocna stapka : 0
Iznos : 4
Datum na vlez : 951230
------------------------------------------------
Sifra : 1
Opis : opis1
Edinecna cena : 2
Vlezna kolicina : 2
Izlezna kolicina : 0
Danocna stapka : 0
Iznos : 4
Datum na vlez : 101
------------------------------------------------

The above is a file called "directory.dat" and I want to know how can I take off the integer of a specific line containing a specific text? For example, if I want to make a sum of all the lines with "Edinecna cena", how can I specifically get all integers from those lines only?


Solution

  • You can read your file line-by-line (the proper approach without eof() is suggested by 0x499602D2):

    ifstream dir("directory.dat");
    string line;
    while(getline(dir, line)){
        //(process the line)
    }
    

    Check whether your line (string priceLn = "Edinecna cena : ";) matches to the beginning of the line, and extract the price:

    // process the line:
    if(line.find(priceLn)==0){
        price = stoi(line.substr(priceLn.size()));
    }
    

    PS: strncmp() can incur in smaller overhead while reading the file. We can rewrite the if statement like this:

    if(line.size() >= priceLn.size() && 
       strncmp(line.c_str(), priceLn.c_str(), priceLn.size()) == 0) {...}