如何解决C程序未填充应按条件填充的写文件
我正在编写一个C程序,该程序通过shell接收文件(日志文件)和其他一些参数。该程序的目标是获取该文件,将其分成多个文件(与nmappers的值一样多),并将每个新文件分配给一个进程,以便该进程可以读取这些文件的某些内容并生成一些新文件以进行写入在他们。输入文件(称为拆分文件)的数量和输出文件(称为buf文件)的数量都是nmappers变量的值。
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <stdlib.h>
bool validarEntrada(int argc,char *argv[]);
bool validarConsulta(char *consulta,int *col,int *val,char **signo);
int main(int argc,char *argv[])
{
int opc,col,val,lineas,nmappers,nreducers,intermedios,lineasPorArchivo,lineasHuerfanas;
int cuentaArchivo=1,cuentaRegistro=0,ncol=0;
bool salir = false,tieneHuerfana = false,encontroCadena = false;
char *consulta = (char*) malloc(10);
char *signo = (char*) malloc(2);
FILE *ptrLectura,*ptrEscritura;
char registro[150],nombreArchivo[10],cadena[25],caracter;
if(validarEntrada(argc,argv))
{
lineas = atoi(argv[2]);
nmappers = atoi(argv[3]);
nreducers = atoi(argv[4]);
intermedios = atoi(argv[5]);
printf("%d\n",nreducers);
do
{
printf("\n1. Realizar consulta");
printf("\n2. Salir del sistema");
printf("\nopc: ");
scanf("%d",&opc);
switch(opc)
{
case 1:
printf("Ingrese la consulta que quiere hacer: ");
scanf("%s",consulta);
if(validarConsulta(consulta,&col,&val,&signo))
{
printf("\n[EN PROCESO]-Buscando registros de la columna %d que sean %s %d\n",signo,col);
printf("\n[EN PROCESO]-Generando archivos buf necesarios");
ptrLectura = fopen("logfile","r");
if (!ptrLectura)
return -1;
lineasPorArchivo = lineas/nmappers;
lineasHuerfanas = lineas%nmappers;
sprintf(nombreArchivo,"split%d",cuentaArchivo);
ptrEscritura = fopen(nombreArchivo,"w");
while (fgets(registro,sizeof registro,ptrLectura) != NULL)
{
if(cuentaRegistro == lineasPorArchivo)
{
fclose(ptrEscritura);
cuentaRegistro = 0;
cuentaArchivo++;
sprintf(nombreArchivo,cuentaArchivo);
ptrEscritura = fopen(nombreArchivo,"w");
tieneHuerfana = false;
if (!ptrEscritura)
return -1;
}
fprintf(ptrEscritura,"%s",registro);
cuentaRegistro++;
if(lineasHuerfanas > 0 && !tieneHuerfana)
{
if(fgets(registro,ptrLectura) != NULL)
{
fprintf(ptrEscritura,registro);
lineasHuerfanas--;
tieneHuerfana = true;
}
}
}
fclose(ptrLectura);
fclose(ptrEscritura);
//SE CREAN LOS nmappers PROCESOS PARA QUE CREEN LOS BUF
for(int i = 1; i <= nmappers; i++)
{
if(fork() == 0)
{
printf("HOLA%d",i); ///////////////////HERE///////////////////////////////////////////////
sprintf(nombreArchivo,i);
ptrLectura = fopen(nombreArchivo,"r");
sprintf(nombreArchivo,"buf%d",i);
ptrEscritura = fopen(nombreArchivo,"w");
while((caracter = fgetc(ptrLectura)) != EOF)
{
if(caracter != ' ' && caracter != '\n' && !encontroCadena)
{
strncat(cadena,&caracter,1);//Pa que sirva toca con &
ncol++;
encontroCadena = true;
}
else if(caracter != ' ' && caracter != '\n' && encontroCadena)
{
strncat(cadena,1);//Pa que sirva toca con &
}
else if(caracter == ' ')
{
encontroCadena = false;
}
if(caracter == '\n')
{
fprintf(ptrEscritura,"%s\n",cadena);
ncol = 0;
}
}
exit(0);
}
}
}
else
{
printf("\n[ERROR]-Solo se aceptan los signos: [<|<=|>|>=|=]");
printf("\n -El formato debe ser: columna,valor\n");
}
break;
case 2:
salir = true;
break;
default:
printf("\nLa opcion %d NO es valida,escoja una opcion valida!\n",opc);
break;
}
wait(NULL);
}while(!salir);
}
else
{
return -1;
}
return 0;
}
bool validarEntrada(int argc,char *argv[])
{
int lineas,intermedios;
if(argc != 6)
{
printf("\n[ERROR]-El uso correcto es: $ analogp logfile lineas nmappers nreducers intermedios\n");
return false;
}
lineas = atoi(argv[2]);
nmappers = atoi(argv[3]);
nreducers = atoi(argv[4]);
intermedios = atoi(argv[5]);
if(lineas <= 0 || nmappers <= 0 || nreducers <= 0)
{
printf("\n[ERROR]-Se debe cumplir que: lineas,nreducers > 0\n");
return false;
}
if(nreducers > nmappers)
{
printf("\n[ERROR]-Se debe cumplir que: nreducers <= nmappers\n");
return false;
}
if(intermedios != 0 && intermedios != 1)
{
printf("\n[ERROR]-Se debe cumplir que: intermedios ∈ {0,1}\n");
return false;
}
return true;
}
bool validarConsulta(char *consulta,char **signo)
{
char *columna,*simbolo,*valor;
columna = strtok(consulta,",");
*signo = strtok(NULL,");
valor = strtok(NULL,");
*col = atoi(columna);
*val = atoi(valor);
return (strcmp(*signo,"<") == 0 || strcmp(*signo,"<=") == 0 || strcmp(*signo,">") == 0 || strcmp(*signo,">=") == 0 || strcmp(*signo,"=") == 0);
}
在编译代码时,gcc编译器不会给出任何类型的错误。运行该程序时,一切都会顺利进行,并且所有预期的buf文件(输出文件)都已生成,但未填充,它们都是空白。我敢肯定,所有人都会认为该错误来自代码的这一部分,我正在从输入文件中读取一些信息以将其写入输出文件:
for(int i = 1; i <= nmappers; i++)
{
if(fork() == 0)
{
printf("HOLA%d",i); //////////////////////////////////////////////////////////////////
sprintf(nombreArchivo,cadena);
ncol = 0;
}
}
exit(0);
}
}
}
问题是,我100%确保它不是从那里来的,因为在开始编写此程序之前,我正在另一个程序中工作,该程序使用完全相同的逻辑来读取输入文件并写入到输出文件,并且工作正常,输出文件不是空白文件。
观察:printf()后跟//////////////////////////////// HERE //// ///////////////没有在控制台上打印任何内容,并且在运行程序时,“致命错误:glibc检测到无效的stdio句柄”错误显示的次数与该值相同nmappers
希望有人可以帮助我!预先感谢!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。