Estoy tratando de ejecutar una aplicación en el indicador de desarrollador de CMD, debería tener un archivo de entrada y un archivo de salida usando argumentos de línea de comando (que no entiendo o no puedo entender). Pero cuando lo hago, se ejecuta y finaliza, pero no se imprime nada en el archivo de salida. A continuación se muestra mi código con el código no relevante redactado. No sé si estoy haciendo algo mal en el código o en el indicador del desarrollador de la línea cmd. estoy compilando y luego digo que la aplicación se llama printlines.exe estoy diciendo:

printlines.exe -i file.java -o output.txt Cualquier consejo sería muy apreciado.

#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#define LINE 1000

void countLines(int *emptyLines, int *totalLines, int *totalComments, char *fileName, FILE *readFile)
{
    
    char line[LINE]; // set array to store input file data
    //set variables
    readFile = fopen(fileName, "r");
    int lines = 0; 
    int comments = 0;
    int empty = 0;
    
        while(fgets(line, LINE, readFile) != NULL) //while loop that reads in input file line by line
        {
            /*counts lines in input file works when not using 
            command line arguments redacted to shorten */
         }

    fclose(readFile);   
    
    *emptyLines = empty;
    *totalLines = lines;
    *totalComments = comments;
}


int main(int argc, char *argv[])
{
    FILE *inputFile;
    FILE *outputFile;
    char *outputName;
    char *inputName; 
    
    inputName = argv[1];
    outputName = argv[2];
    
    
    
    inputFile = fopen(inputName, "r");
    outputFile = fopen(outputName, "w");
    
    int emptyLines, totalLines, totalComments;
    countLines(&emptyLines, &totalLines, &totalComments, inputName, inputFile);
    int character;
    bool aComment = false;
    
    while((character = fgetc(inputFile)) != EOF) 
    {
        /* code that writes info from input to output, works 
          when not using command line arguments redacted to shorten*/
    } 
    
    
    //close files
    fclose(inputFile);
    fclose(outputFile);

    printf("There are %d total lines, %d lines of code and %d comments in the file\n", totalLines, emptyLines, totalComments);
    return 0;
}
2
Byronnicle Fry 14 mar. 2021 a las 20:51

1 respuesta

La mejor respuesta

No se realiza ninguna comprobación de errores, ni para los argumentos de la línea de comandos ni para los errores al abrir los archivos. Estoy dispuesto a apostar a que identificaría rápidamente el problema si hiciera lo siguiente:

//....
if(argc < 5){ // check arguments
    fprintf(stderr, "Too few arguments");
    return EXIT_FAILURE;
}

inputFile = fopen(inputName, "r"); 
if(inputFile == NULL){ // chek if file was open
    fprintf(stderr, "Failed to open input file\n");
    return EXIT_FAILURE;
}
outputFile = fopen(outputName, "w");
if(outputFile == NULL){ // again
    fprintf(stderr, "Failed to open output file\n");
    return EXIT_FAILURE;
}
//...

Tenga en cuenta que su cadena de línea de comando tiene 5 argumentos, y los nombres de archivo están en los índices 2 y 4, por lo que necesitaría:

inputName = argv[2];
outputName = argv[4];

O simplemente elimine -i y -o ya que parece que no están haciendo nada.

También debo señalar que puede usar argumentos de línea de comando directamente en fopen o en su función, no hay necesidad de los dos punteros adicionales:

inputFile = fopen(argv[2], "r");
outputFile = fopen(argv[4], "w");
//...
countLines(&emptyLines, &totalLines, &totalComments, argv[2], inputFile);
5
anastaciu 14 mar. 2021 a las 18:33