C程序未填充应按条件填充的写文件

如何解决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 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-