Anonymní profil Tuqi – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Anonymní profil Tuqi – Programujte.comAnonymní profil Tuqi – Programujte.com

 

Příspěvky odeslané z IP adresy 87.249.156.–

Tuqi
C / C++ › Seřazování databází a zapiso…
23. 3. 2013   #173176

Ahoj, mám už nějakou dobu rozdělaný program a nemůžu s ním pohnout. Úkolem je otevřít dva souboru, na řádcích jméno - mezera - číslo, seřadit je podle abecedy a vypsat do jiného souboru tak, že pokud se shoduje jméno v 1. souboru se jménem v 2. souboru, vypíše do výstupního souboru tvar jméno-číslo v 1. souboru - číslo v 2. souboru, jinak nuly. Program sice funguje, ale ve valgrindu ukazuje memory leaky... nevím, kde: 

#ifndef __PROGTEST__
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <iomanip>
#include <string>
#include <fstream>
#include <sstream>
#include <vector>
#include <algorithm>
using namespace std;
#endif /* __PROGTEST__ */

struct DB{
string jmeno;
int cislo;
};

#define MAX 10 
#define VETSI (pocet1 > pocet2 ? pocet1 : pocet2)

int i, j = 0, chyba = 0;

void vypocetPrvku(string radek, DB * dtbs, int j, int chyba){
    istringstream prvni(radek);
    string token;
    i = 1;
   
    while(getline(prvni, token, ' ')){
        if(i == 1) dtbs[j].jmeno = token;
        else {
            if(i == 2) 
           /* {istringstream pretyp(token); //pretypovani string > int
            int tkn;
            pretyp >> tkn;
            dtbs[j].cislo = tkn;}*/
            {
            int k;
            for(k = 0; k+1 < token.size(); k++){
                if(token[k] != '0' && token[k] != '1' && token[k] != '2' && 
                        token[k] != '3' && token[k] != '4' && token[k] != '5' &&
                        token[k] != '6' && token[k] != '7' && token[k] != '8' &&
                        token[k] != '9' && token[k] != ' ')
                { chyba = 1;
                cout << "chyba " << endl;
                break; 
                }
                
            }
            if(chyba != 1) {
              istringstream pretyp(token); //pretypovani string > int
            int tkn;
            pretyp >> tkn;
            dtbs[j].cislo = tkn;  
            }
            
            }
            }i++;}
        }



int vypocetRadku(const char * inFile, DB * dtbs, int chyba){
    
    
    ifstream in(inFile);
    string radek;
    j = 0;
    while(!in.eof()){
        getline(in, radek);
        if(in.eof() && radek.empty()) break;
       vypocetPrvku(radek, dtbs, j, chyba);
       j++;
    }
    return j;
}

DB bubblesort(DB * dtbs, int pocet){
    DB pom;
    for(i=0; i < pocet; i++) {
        for(j=0; j < pocet - i - 1; j++) {
             if(dtbs[j].jmeno > dtbs[j+1].jmeno) {
                pom = dtbs[j+1];
                dtbs[j+1] = dtbs[j];
                dtbs[j] = pom;
            }}}
    return dtbs[pocet];
}

bool joinFiles  ( const char * inFile1,
                  const char * inFile2,
                  const char * outFile )
 {
    DB dtbs1[MAX];
    int pocet1 = vypocetRadku(inFile1, dtbs1, chyba);
    cout << chyba << endl;
    if(chyba == 1) {
        cout << "aha..." << endl;
        return false;}
    DB dtbs2[MAX];
    int pocet2 = vypocetRadku(inFile2, dtbs2, chyba);
    if(chyba == 1) {
        cout << "aha..." << endl;
        return false;}
    
    for(i = 0; i < pocet1; i++) {
        cout << dtbs1[i].jmeno << "***";
        cout << dtbs1[i].cislo << endl;}
    for(i = 0; i < pocet2; i++) {
        cout << dtbs2[i].jmeno << "***";
        cout << dtbs2[i].cislo << endl;}
    cout << "*************************" << endl;
    
    for(i = 0; i < VETSI; i++) {
        for(j = i+1; j < VETSI; j++){
            if(dtbs1[i].jmeno == dtbs1[j].jmeno || dtbs2[i].jmeno == dtbs2[j].jmeno)
                return false;
        }
    }
    
    DB dtbs1b[MAX];
    DB dtbs2b[MAX];
    
    bubblesort(dtbs1, pocet1);
    bubblesort(dtbs2, pocet2);
    
    memcpy(&dtbs1b, &dtbs1, sizeof(dtbs1));
    memcpy(&dtbs2b, &dtbs2, sizeof(dtbs2));
    
    for(i = 0; i < pocet1; i++) {
        cout << dtbs1b[i].jmeno << "***";
        cout << dtbs1b[i].cislo << endl;}
    for(i = 0; i < pocet2; i++) {
        cout << dtbs2b[i].jmeno << "***";
        cout << dtbs2b[i].cislo << endl;}
    
    
    ofstream out(outFile);
    
    int a = 0, b = 0;
    
    for(i = 0; i < pocet1 + pocet2; i++){
        
            if(a == pocet1 && b == pocet2) break;
            if(a == pocet1) dtbs1b[a].jmeno = "zzz";
            if(b == pocet2) dtbs2b[b].jmeno = "zzz";
            
            if(dtbs1b[a].jmeno == dtbs2b[b].jmeno && a != pocet1 && b != pocet2){
                out << dtbs1b[a].jmeno << " " << dtbs1b[a].cislo << " " 
                        << dtbs2b[b].cislo << "\n";
                 a++;
                 b++;
                 continue;
            }
            if(dtbs1b[a].jmeno < dtbs2b[b].jmeno && a != pocet1){
                out << dtbs1[a].jmeno << " " << dtbs1[a].cislo << " 0" << "\n";
                 a++;
                 continue;
            }
            if(dtbs1b[a].jmeno > dtbs2b[b].jmeno && b != pocet2){
                out << dtbs2b[b].jmeno << " 0 " << dtbs2b[b].cislo << "\n";
                 b++;
                 continue;
            }}
            
    
    return true;
}

#ifndef __PROGTEST__
int main ( int argc, char * argv [] )
 {
    const char *inFile1 = "inA_0.txt";
    const char *inFile2 = "inB_0.txt";
    const char *outFile = "out_0.txt";
    
    joinFiles(inFile1, inFile2, outFile);
   return 0;
 }
#endif /* __PROGTEST__ */

Přijde mi, že valgrindu chybí destruktory, ale myslela jsem, že ty patří jen k příkazu new...

Díky za jakékoli rady...

 

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý