在循环中创建一些文件之后无法创建新文件

时间:2016-10-15 23:17:38

标签: c++ vector memory-leaks fstream

重新制定问题,我有这个代码,读取文件夹中的2500个文件的名称,然后逐个读取它们并从中提取特定信息,将该信息写入新文件,问题是提取后正好533文件的信息它没有打开下一个,extrae函数通过日志告诉我文件不能打开,但我确保每次打开文件我关闭它后我提取我需要的信息,所以我不知道为什么它不允许我读取533文件后的文件,帮助PLZ

这是我提取信息的功能

enter code here

std::vector<Cliente> Extraccion::extrae(std::string path, std::vector<Journal> conjunto, std::vector<BanderaEnvio> envios, std::vector<CFD> cfd, std::vector<TIM> tim, std::vector<CentroReparto> lista, std::vector<DomiciliacionS702> domis, std::vector<CargosEnAclaracion> cargos, std::vector<CaracImpresion> impresion) 
{   
        std::vector<Cliente> clientesF;
        std::vector<Encabezado> encabezados;
        clientesF.clear();
        encabezados.clear();
        Cliente *nuevoCliente = new Cliente();      
        int i = 0;
        std::string bin = "";
        int r =0;           
        int countCli=0;     
        long tmaline;
        bool bwrite = true;
        std::string canal = "";
        std::string msglog = "";
        int ctesOmitidos = 0;
        int openFile = 0;         
        std::string linea = "";
        std::fstream file;      
        std::cout<<"---Extrae el Archivo "<<path<<std::endl;
        file.open(path.c_str(), ios::in);
        if (file.good())
        {       
            // //std::cout<<"____________________entra a leer archivo______________________"<<std::endl<<std::endl;
            while(!file.eof())
            {                   
                /*lee la longitud de la linea */
                std::getline(file,linea);
                i++;
                // std::cout<<"LINEA "<<i<<std::endl;
                tmaline = linea.length();               
                canal = linea.substr(0, 3);             
                /*Metemos la Cabecera(canales con HD al inicio), donde viene el num de cliente y su producto */
                if(linea.substr(0, 2) == "HD")
                {
                    Encabezado cab(linea.substr(3,6),util.trim(linea.substr(66,30)));//new Encabezado(linea.substr(3,6),util.trim(linea.substr(66,30))); //.util.trim()
                    encabezados.push_back(cab);                     
                    // //std::cout<<"AQUI ESTA EL PRODUCTO :  "<<cab.getProducto()<<std::endl;
                    // //std::cout<<util.trim(linea.substr(66,30)); //cab.producto;
                }
                else
                {
                    //cout<<"---------no hay encabezados---------"<<std::endl<<std::endl;
                    if (canal == "BH1") 
                    {
                        //case 1/*"BH1"*/:
                        if(nuevoCliente->strCliente.numCta != "0")
                        {                                   
                            if (bwrite  == true)
                            {           
                                if(nuevoCliente->strCliente.saldoEPP=="")
                                    nuevoCliente->strCliente.saldoEPP="[0.00]";

                                if(nuevoCliente->strCliente.saldoPromCompr=="")
                                    nuevoCliente->strCliente.saldoPromCompr="0.00";

                                if(nuevoCliente->strCliente.saldoPromDispo=="")
                                    nuevoCliente->strCliente.saldoPromDispo="0.00";

                                if(nuevoCliente->strCliente.saldoProm=="")
                                    nuevoCliente->strCliente.saldoProm="0.00";

                                if(nuevoCliente->strCliente.saldoPromDispMax=="")
                                    nuevoCliente->strCliente.saldoPromDispMax="0.00";                                   
                                clientesF.push_back(*nuevoCliente);                                         
                            }
                            else
                            {
                                // //std::cout<<"Falso para: "<<nuevoCliente->strCliente.numCta<<"|"<<nuevoCliente->strCliente.numtargta<<std::endl;
                                countCli--;
                                ctesOmitidos++;
                            }
                            nuevoCliente = new Cliente();
                            nuevoCliente->strCliente.numCta = "0";
                            msglog = "";
                            bwrite = true;
                            //nuevoCliente = new Cliente(); 
                        }

                        if(tmaline >= 1308) 
                        {
                            ++countCli; 
                            nuevoCliente->strCliente.numCta = linea.substr(9,19);                               //NUMERO DE CUENTA
                            nuevoCliente->strCliente.numCliente = linea.substr(47,19);                          //NUMERO DE CLIENTE
                            bin=linea.substr(12, 6);
                            nuevoCliente->strCliente.jobOrigen = getProdJob(getNombreENTR(path),encabezados[0].getProducto().substr(0, 8));   //.get(0).getProducto().substr(0,8));
                            nuevoCliente->strCliente.numCta = linea.substr(9,19);                               //NUMERO DE CUENTA
                            nuevoCliente->strCliente.numtargta = linea.substr(28,19);                           
                            nuevoCliente->strCliente.domiciliacion = getDomiciliacion(domis, nuevoCliente->strCliente.numtargta);           //DOMICILIACION
                            nuevoCliente->strCliente.cargosEnAclaracion=getCargo(cargos, nuevoCliente->strCliente.numCta+nuevoCliente->strCliente.numtargta);       //CARGOS ACLARACION
                            nuevoCliente->strCliente.numCliente = linea.substr(47,19);                          //NUMERO DE CLIENTE
                            nuevoCliente->strCliente.numContra = " ";                                               //NUMERO DE CONTRATO
                            nuevoCliente->strCliente.bandEnvio = linea.substr(867,1);                       //BANDERA ENVIO
                            nuevoCliente->strCliente.codBar = getCodigoBarras(conjunto,linea.substr(28,19));    //NUMERO DE TARJETA regresa CODIGO BARRAS
                            nuevoCliente->strCliente.medEnvio = getBandEnvio(envios,linea.substr(867,1));   //BANDERA regresa MEDIO ENVIO
                            nuevoCliente->strCliente.numProd = linea.substr(3,6);
                            nuevoCliente->strCliente.nomProd = getProducto(encabezados,linea.substr(3,6));  //NUM PRODUCTO regresa NOMBRE PRODUCTO
                            nuevoCliente->strCliente.fechaAper = completaFechaAp(linea.substr(981,6));      //FECHA APERTURA
                            nuevoCliente->strCliente.saldoActCorte = convierteCifras(linea.substr(206,12)); //SALDO ACTUAL AL CORTE
                            nuevoCliente->strCliente.saldoTotalCorte = convierteCifras(linea.substr(1296,12));//SALDO TOTAL AL CORTE
                            nuevoCliente->strCliente.mesesVencidos = linea.substr(739,1);                    //MESES VENCIDOS
                            nuevoCliente->strCliente.fechaLimite = completaFechaAp(linea.substr(230,6));        //FECHA LIMITE
                            nuevoCliente->strCliente.fechaCorte = completaFechaAp(linea.substr(224,6));     //FECHA CORTE
                            nuevoCliente->strCliente.fechaCorteArch = encabezados[0].getProducto().substr(0,4)+encabezados[0].getProducto().substr(6,2);//"FECHA";//getFechaArch(path);                     //FECHA CORTE ARCHIVO
                            nuevoCliente->strCliente.nombre = util.trim(linea.substr(486,40));//.util.trim();                   //NOMBRE
                            nuevoCliente->strCliente.cp = util.trim(linea.substr(726,12));//.util.trim();                       //CODIGO POSTAL
                            nuevoCliente->strCliente.cr = getCentroReparto(lista, nuevoCliente->strCliente.cp);
                            nuevoCliente->strCliente.dir1 = util.trim(linea.substr(526,40));//.util.trim();                     //{
                            nuevoCliente->strCliente.dir2 = util.trim(linea.substr(566,40));//.util.trim();                             
                            nuevoCliente->strCliente.dir3 = util.trim(linea.substr(606,40));//.util.trim();                     //DIRECCION
                            nuevoCliente->strCliente.dir4 = util.trim(linea.substr(646,40));//.util.trim();
                            nuevoCliente->strCliente.dir5 = util.trim(linea.substr(686,40));//.util.trim();                     //}
                            nuevoCliente->strCliente.altBlockCode = linea.substr(869,1);                        //ALT BLOCK CODE
                            nuevoCliente->strCliente.blockCode = linea.substr(868,1);                       //BLOCK CODE
                            nuevoCliente->strCliente.uuID =getUId(cfd, tim,nuevoCliente->strCliente.numCta.substr(3,16));               //UUID
                            nuevoCliente->strCliente.tipo = isNuevo(nuevoCliente->strCliente.fechaAper, nuevoCliente->strCliente.fechaCorte, 30);   
                        }
                        else
                        {
                            if (tmaline >= 66)  
                            {
                                    nuevoCliente->strCliente.numCliente = linea.substr(47,19);
                                    nuevoCliente->strCliente.numCta = linea.substr(9,19);
                            }else
                            {
                                    nuevoCliente->strCliente.numCliente = "No Identificado";
                                    nuevoCliente->strCliente.numCta = "XX";
                            }
                            bwrite  = false;
                            msglog = msglog + "Canal BH1 Linea " + std::to_string(i)+"; ";                  
                        }               
                    } /*Fin if Canal BH1*/                  
                    else if (canal == "BH2")
                    {
                        /*Lectura Canal BH2*/
                        if (tmaline >= 781) 
                        {
                             std::string plan = linea.substr(79,5);                 //PLAN
                             int p = atoi(plan.c_str());//integer.parseInt(plan);
                             if(p>=90000 && p<=91200)
                             {  // [90000,91200]    
                                std::string saldo = convierteCifras(linea.substr(769,12));
                                nuevoCliente->strCliente.saldoEPP+="["+saldo+"]";
                                //cout<<" BH2 saldoEPP: "<<nuevoCliente->strCliente.saldoEPP <<" Cliente :"<<nuevoCliente->strCliente.numCliente<<std::endl;
                            }
                        }
                        else
                        {
                            bwrite  = false;
                            msglog = msglog + "Canal BH2 Linea " + std::to_string(i) + "; ";
                        }
                    }/*Fin if Canal BH2*/                   
                    else if(canal == "BH6")
                    {
                        if (tmaline >= 453) 
                        {
                            nuevoCliente->strCliente.plasticID=linea.substr(148,3);
                            nuevoCliente->strCliente.disenoImpresion=dameDisenoImpresion(impresion, linea.substr(148,3)+" "+bin);
                            nuevoCliente->strCliente.tipoImpresion=dameTipoImpresion(impresion, linea.substr(148,3)+" "+bin);
                            std::string rfc = isRfcValido(linea.substr(440,13));                    //RFC
                            //string rfc;
                            nuevoCliente->strCliente.tipoPer = rfc.substr(0, 2);
                            nuevoCliente->strCliente.rfcFinal = rfc.substr(2, (rfc.length()-2));
                            if(nuevoCliente->strCliente.tipoPer == ("PI"))
                            {
                                nuevoCliente->strCliente.tipoPer ="RFC INCORRECTO";
                            }
                        }
                        else
                        {
                            bwrite  = false;
                            msglog = msglog + "Canal BH6 Linea " + std::to_string(i) + "; ";                                                        
                        }
                    }/*Fin if Canal BH6*/                   
                    else if (canal == "BHV")
                    {
                        if( tmaline >= 318 ){

                            if(linea.substr(101,12) !="00000000000 ")
                                nuevoCliente->strCliente.saldoPromCompr = convierteCifras(linea.substr(101,12));

                            if(linea.substr(306,12)!="00000000000 ")
                                nuevoCliente->strCliente.saldoPromDispo = convierteCifras(linea.substr(306,12));

                            if(linea.substr(227,12)!="00000000000 ")
                                nuevoCliente->strCliente.saldoProm = convierteCifras(linea.substr(227,12));

                            if(linea.substr(164,12)!="00000000000 ")
                                nuevoCliente->strCliente.saldoPromDispMax = convierteCifras(linea.substr(164,12));
                        }
                        else{
                            bwrite  = false;
                            msglog = msglog + "Canal BHV Linea " + std::to_string(i) + "; ";                                                        
                        }
                    }/*Fin if Canal BHV*/                   
                }/*FIN DEL ELSE AL HD*/                         
            }/*FIN DEL CICLO*/          
            file.close();
        }/*FIN DEL IF OPEN*/
        else
        {
            std::cout<<"ERROR!!! el archivo "<<path<<" no se pudo crear"<<std::endl;            
        } 
        delete(nuevoCliente);
        std::cout<<"sale del extrae"<<std::endl;    
        // file.close();
        return clientesF;           
}/*FIN DEL EXTRAE*/

在主要版本中,我为每个循环调用每个文件读取的提取函数

enter code here
int main(int argc, char** args)
{
    time_t now = time(0);
    tm *ltm = gmtime(&now); 
    std::string shini = std::to_string(ltm->tm_hour)+":"+std::to_string(ltm->tm_min)+":"+std::to_string(ltm->tm_sec);
    std::ofstream archivo;
    archivo.open("/desarrollo/pruebasc++/pruebasJuan/Salida/tiempos.txt");
    archivo<<shini<<std::endl;
/*----------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
//comienza la prueba
    Extraccion ex = {};
    ManejaArchivos archivos{};
    std::vector<Cliente> todosClientes;
    std::vector<BanderaEnvio> banderasEnvio;
    std::vector<CFD> CFDS;
    std::vector<TIM> TIMS;
    std::vector<CentroReparto> centrosReparto;
    std::vector<DomiciliacionS702> domicilios;
    std::vector<CargosEnAclaracion> cargos;
    std::vector<CaracImpresion> impresiones;
    std::vector<Journal> journals;  
    banderasEnvio.clear();
    centrosReparto.clear();
    impresiones.clear();    
    std::string pathENTR = "";
    std::string pathJOUR = "";
    int ppba = 1; /*1- Usa la ruta de Producción; 2- Usa nuestra ruta de prueba*/
    if (ppba == 1)
    {
        pathENTR = "/NAS01/01.Ingenieria_NFS/08_Agosto";//args[0];//C:/Users/efmartinezg/Desktop/IsaacDATAMART_030916";
        pathJOUR = "/user1/BANAMEX/Salida_doc1/TDC_L6_ECS/08_Agosto";//args[1];//"C:/Users/efmartinezg/Desktop/IsaacDATAMART_030916/jour";
    }
    else
    {
        pathENTR = "/desarrollo/pruebasc++/pruebasJuan/ENTR";//args[0];//C:/Users/efmartinezg/Desktop/IsaacDATAMART_030916";
        pathJOUR = "/desarrollo/pruebasc++/pruebasJuan/JOURNAL";//args[1];//"C:/Users/efmartinezg/Desktop/IsaacDATAMART_030916/jour";
    }   
    std::string pathMedioEnvio = "/NAS01/01.Ingenieria_NFS/08_Agosto/Medio_envio_Flag.TXT";//args[2];//"C:/Users/efmartinezg/Desktop/IsaacDATAMART_030916/otros/Medio_envio_Flag.TXT";
    std::string pathSalida = "/desarrollo/pruebasc++/pruebasJuan/Salida";//args[3];//"C:/Users/efmartinezg/Desktop/IsaacDATAMART_030916/Salida";
    std::string pathCentrRep = "/NAS01/01.Ingenieria_NFS/08_Agosto/catalogo_sepomex.txt";//args[4];//"C:/Users/efmartinezg/Desktop/IsaacDATAMART_030916/otros/catalogo_sepomex.txt";
    std::string pathImpresion = "/NAS01/01.Ingenieria_NFS/08_Agosto/ControlBanderas.txt";//args[5];//C:/Users/efmartinezg/Desktop/IsaacDATAMART_030916/otros/ControlBanderas.txt";  
    double pesoENTR = 0;
    double pesoDOM = 0;
    double pesoDISP = 0;
    double pesoTIM = 0;
    double pesoCFD = 0;
    double pesoJOUR = 0;
    double sumaPesos = 0;
    double tiempo = 0;
    std::vector<std::string> jours; 
    std::vector<std::string> entrs = archivos.getENTRS(pathENTR);
    archivo<<"Nombres de archivos"<<std::endl;
    int contadorIteraciones = 0;    
    if (entrs.size() >= 1 )
    {
        std::cout<<"Lee los Catalogos Medio_envio_Flag, BanderaEnvio y CaracImpresion"<<std::endl;
        banderasEnvio = archivos.leerBanderaEnvio(pathMedioEnvio);
        centrosReparto = archivos.leerCentroReparto(pathCentrRep);
        impresiones = archivos.leerCaractImpresion(pathImpresion);      
    }
    for(auto arch : entrs)
    {
        contadorIteraciones++;
        archivo<<contadorIteraciones<<"--Procesando Archivo ENTR: "<<arch<<"----------------------------------------------"<<std::endl;
        std::cout<<contadorIteraciones<<"--Procesando Archivo ENTR: "<<arch<<"-------------------------------------------------------------"<<std::endl;
        std::cout<<"  Procesando.... *"<<std::endl;
        // //std::cout<<pathJOUR<<" -- antes del getJournals"<<std::endl;
        jours = archivos.getJournals(pathJOUR, arch);
        std::string pathUnJour = "";
        for (auto jour : jours)
        {
            archivo<<"   -Jour: "<<" -- "<<jour<<std::endl;
            journals.clear();
            journals = archivos.leeJournal(pathUnJour, jour);       
            pathUnJour = "";
        }
        std::string nombreCFD = archivos.archivoRelacionado(pathENTR, arch, "CFD");
        if(nombreCFD != "" )
        {   
            CFDS.clear();
            CFDS = archivos.leeCFD(pathENTR, nombreCFD);
        }

        std::string nombreTIM = archivos.archivoRelacionado(pathENTR, arch, "TIM");
        if(nombreTIM != "" )
        {
            TIMS.clear();
            TIMS = archivos.leeTIM(pathENTR, nombreTIM);
        }
        std::string nombreDomiciliacion = archivos.getArchivotS702(pathENTR, arch); 
        std::string nombreDisp = archivos.getArchivoEPSTDISP(pathENTR, arch);       
        domicilios.clear();
        domicilios = archivos.leerDomiciliacion(pathENTR);      
        cargos.clear();
        cargos = archivos.leerCargosAclaracion(pathENTR);
        std::string pathArchivo = pathENTR + "/" + arch;
        todosClientes.clear();
        todosClientes = ex.extrae(pathArchivo, journals, banderasEnvio, CFDS, TIMS, centrosReparto, domicilios, cargos, impresiones);
        archivos.generaArchivo(pathSalida, todosClientes, arch);
        std::cout<<"  Procesando.... +"<<std::endl;
    }
    time_t tfin = time(0);  
    ltm = gmtime(&tfin);    
    std::string shfin = std::to_string(ltm->tm_hour) + ":" + std::to_string(ltm->tm_min) + ":" + std::to_string(ltm->tm_sec);
    archivo<<shfin;
    archivo.close();    
    return 0;
}
顺便说一句,我用linux基础服务器编译,谢谢大家!

0 个答案:

没有答案