重新制定问题,我有这个代码,读取文件夹中的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基础服务器编译,谢谢大家!