argc argv with file

Asked

Viewed 88 times

-1

Someone can help me, I need to open a read-only txt file informed by the user with argc and argv but the file does not open, is giving error in opening the file

here my . c

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include "locadora.h"
int main(int argc, char *argv[]){
    int op, x, n;
    char nomeArq[100], vet[5], *token, texto[256];
    FILE *entrada;
    setlocale(LC_ALL,"");
    printf ("Digite o nome do  arquivo de entrada: ");
    scanf ("%s[^\n]", nomeArq);
    if (entrada = fopen(argv[1], "r") == NULL){
        printf ("Erro no Arquivo.\n");
    }
    else {
        fgets (vet,(sizeof(vet)-1), entrada);
        n = atoi(vet);
        p = (struct Filmes*) malloc (sizeof(struct Filmes) * n);
        for (x = 0; x < n; x++){
            fgets (texto, (sizeof(texto)-1),entrada);
            p[x].codigo = x + 1;
            token = strtok(texto,";");
            strcpy(p[x].titulo, token);
            token = strtok(NULL,";");
            p[x].ano = atoi(token);
            token = strtok(NULL,";");
            p[x].quantidade = atoi(token);
            troca();
            token = strtok(NULL, "\n");
            p[x].genero = atoi(token);
        }
        fclose(entrada);
    }
    while(1) {
        printf ("\nNúmeros de títulos cadastrados no acervo: %d\n", n);
        printf ("\nDigite uma opção:\n");
        printf ("\n1 - Locação de filme;\n");
        printf ("2 - Entrega de filme;\n");
        printf ("3 - Busca por título de um filme;\n");
        printf ("4 - Impressão de um filme ou todos filmes;\n");
        printf ("5 - Relatório;\n");
        printf ("0 - Sair.\n");
        scanf ("%d", &op);

        switch (op){
            case 1:
                locacao();
            break;
            case 2:
                entrega();
            break;
            case 3:
                buscar();
            break;
            case 4:
                impressao();
            break;
            case 5:
                relatorio();
            break;
            case 0:
                return 0;
        }
    }
}

here my video rental company. c

void locacao(){
    int codigo, x, n;
    printf ("Digite o código do filme a ser alugado: ");
    scanf ("%d", &codigo);
    for (x = 0; x < n; x++){
        if (p[x].codigo == codigo){
            if (p[x].quantidade > 0){
                p[x].quantidade = p[x].quantidade - 1;
                printf ("Título alugado: %s.\n", p[x].titulo);
            }
        }
        else{
            printf ("Título %s indisponível no acervo.\n", p[x].titulo);
        }
    }
}
void entrega(){
    int codigo, x;
    printf ("Digite o código do filme a ser entregue: ");
    scanf ("%d", &codigo);
     for (x = 0; x < n; x++){
        if (p[x].codigo == codigo){
            p[x].quantidade++;
            printf ("Título devolvido: %s.\n", p[x].titulo);
        }
        else{
            printf ("Título %s inexistente no acervo.\n", p[x].titulo);
        }
    }
}
void buscar(){
    int op, x, codigo, ano;
    char titulo[100], genero[50];
    printf ("Você deseja buscar por qual opção:\n");
    printf ("1 - Código do filme;\n");
    printf ("2 - Título do filme;\n");
    printf ("3 - Ano do filme;\n");
    printf ("4 - Gênero do filmes;\n");
    printf ("5 - Todos.\n");
    scanf ("%d", &op);
        switch (op){
            case 1:
                printf ("Digite o código a ser buscado: ");
                scanf ("%d", &codigo);
                for (x = 0; x < n; x++){
                    if (p[x].codigo == codigo){
                         printf("\nCódigo: %d\n", (p+x)->codigo);
                         printf ("Título: %s\n", (p+x)->titulo);
                         printf ("Ano: %d\n", (p+x)->ano);
                         printf ("Quantidade: %d\n", (p+x)->quantidade);
                         troca();
                         printf("Gênero: %s\n", (p+x)->genero);
                    }
                }
            break;
            case 2:
                printf ("Digite o título a ser buscado: ");
                scanf("%s[^\n]", titulo);
                for (x = 0; x < n; x++){
                    if(strcmp(p[x].titulo, titulo) == 0){
                        printf("\nCódigo: %d\n", (p+x)->codigo);
                        printf ("Título: %s\n", (p+x)->titulo);
                        printf ("Ano: %d\n", (p+x)->ano);
                        printf ("Quantidade: %d\n", (p+x)->quantidade);
                        troca();
                        printf("Gênero: %s\n", (p+x)->genero);
                    }
                }
            break;
            case 3:
                printf ("Digite o ano a ser buscado: ");
                scanf ("%d", &ano);
                for (x = 0; x < n; x++){
                    if(p[x].ano == ano){
                        printf("\nCódigo: %d\n", (p+x)->codigo);
                        printf ("Título: %s\n", (p+x)->titulo);
                        printf ("Ano: %d\n", (p+x)->ano);
                        printf ("Quantidade: %d\n", (p+x)->quantidade);
                        troca();
                        printf("Gênero: %s\n", (p+x)->genero);
                    }
                }
            break;
            case 4:
                printf ("Digite o genero a ser buscado: ");
                scanf ("%s[^\n]", genero);
                for (x = 0; x < n; x++){
                    if(p[x].genero == genero){
                        printf("\nCódigo: %d\n", (p+x)->codigo);
                        printf ("Título: %s\n", (p+x)->titulo);
                        printf ("Ano: %d\n", (p+x)->ano);
                        printf ("Quantidade: %d\n", (p+x)->quantidade);
                        troca();
                        printf("Gênero: %s\n", (p+x)->genero);
                    }
                }
            break;
            case 5:
                for (x = 0; x < n; x++){
                    printf("\nCódigo: %d\n", (p+x)->codigo);
                    printf ("Título: %s\n", (p+x)->titulo);
                    printf ("Ano: %d\n", (p+x)->ano);
                    printf ("Quantidade: %d\n", (p+x)->quantidade);
                    troca();
                    printf("Gênero: %s\n", (p+x)->genero);
                }
            break;
        }
}
void impressao(){
    int op, x;
    char titulo[100];
    printf ("Digite uma opção:\n");
    printf ("1 - Imprimir um filme;\n");
    printf ("2 - Imprimir todos filmes.\n");
    scanf ("%d", &op);
    switch (op){
        case 1:
            printf ("Digite o titulo do filme a ser impresso: ");
            scanf ("%s[^\n]", titulo);
            for (x = 0; x < n; x++){
                    if(strcmp(p[x].titulo, titulo) == 0){
                        printf("\nCódigo: %d\n", (p+x)->codigo);
                        printf ("Título: %s\n", (p+x)->titulo);
                        printf ("Ano: %d\n", (p+x)->ano);
                        printf ("Quantidade: %d\n", (p+x)->quantidade);
                        troca();
                        printf("Gênero: %s\n", (p+x)->genero);
                    }
            }
        break;
        case 2:
            for (x = 0; x < n; x++){
                printf("\nCódigo: %d\n", p->codigo);
                printf ("Título: %s\n", p->titulo);
                printf ("Ano: %d\n", p->ano);
                printf ("Quantidade: %d\n", p->quantidade);
                troca();
                printf("Gênero: %s\n", p->genero);
            }
    }
}
void relatorio(){
    int op, x, ano;
    char genero[50];
    FILE *entrada;
    printf ("Você deseja gerar um relatorio de qual opção: ");
    printf ("\n1 - Ano;\n");
    printf ("2 - Gênero;\n");
    printf ("3 - Completo.\n");
    scanf ("%d", &op);
    switch (op){
        case 1:
            if ((entrada = fopen("ano.txt", "w")) == NULL){
                printf ("Erro no Relatório.\n");
            }
            else{
               printf ("Digite o ano a ser buscado: ");
               scanf ("%d", &ano);
               for (x = 0; x < n; x++){
                    if (p[x].ano == ano){
                        printf("\nCódigo: %d\n", (p+x)->codigo);
                        printf ("Título: %s\n", (p+x)->titulo);
                        printf ("Ano: %d\n", (p+x)->ano);
                        printf ("Quantidade: %d\n", (p+x)->quantidade);
                        troca();
                        printf("Gênero: %s\n", (p+x)->genero);
                    }
               }
               fclose(entrada);
            }
        break;
        case 2:
            if ((entrada = fopen("genero.txt", "w")) == NULL){
                printf ("Erro no Arquivo.\n");
            }
            else{
                printf ("Digite o genero a ser buscado: ");
                scanf ("%s[^\n]", genero);
                for (x = 0; x < n; x++){
                    troca();
                    if (p[x].genero == genero){
                        printf("\nCódigo: %d\n", (p+x)->codigo);
                        printf ("Título: %s\n", (p+x)->titulo);
                        printf ("Ano: %d\n", (p+x)->ano);
                        printf ("Quantidade: %d\n", (p+x)->quantidade);
                        troca();
                        printf("Gênero: %s\n", (p+x)->genero);
                    }
               }
               fclose(entrada);
            }
        break;
        case 3:
            if ((entrada = fopen("completo.txt", "w")) == NULL){
                printf ("Erro no Arquivo.\n");
            }
            else{
                for (x = 0; x < n; x++){
                    printf("\nCódigo: %d\n", (p+x)->codigo);
                    printf ("Título: %s\n", (p+x)->titulo);
                    printf ("Ano: %d\n", (p+x)->ano);
                    printf ("Quantidade: %d\n", (p+x)->quantidade);
                    troca();
                    printf("Gênero: %s\n", (p+x)->genero);
               }
            }
               fclose(entrada);
        break;
    }

}
void troca(){
    int x;
    int genero = (int) p[x].genero;
    switch(genero){
        case 1:
            printf("Drama\n");
        break;
        case 2:
            printf("Romance\n");
        break;
        case 3:
            printf("Desenho\n");
        break;
    }
}

here my . h

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
enum genero{
    drama = 1, romance = 2, desenho = 3
};

typedef struct Filmes{
    int codigo;
    char titulo[100];
    int ano;
    int quantidade;
    enum genero genero;
}filme;

filme *p;
int n;

void locacao();
void entrega();
void busca();
void impressao();
void relatorio();

I apologize for getting too big :)

1 answer

0

Take a look at this example (tested), it uses the first parameter as the complete path to the file:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
    if (argc < 2) {
        fprintf(stderr, "[ E ]: Forneca o caminho completo do arquivo por meio do parametro. \n");
        exit(EXIT_FAILURE);
    }

    FILE *arquivo = fopen(argv[1], "r");

    if (arquivo == NULL) {
        fprintf(stderr, "[ E ]: Arquivo nao encontrado. \n");
        exit(EXIT_FAILURE);
    }

    fclose(arquivo);
    printf("[ I ]: Sucesso. \n");
    return EXIT_SUCCESS;
}

Browser other questions tagged

You are not signed in. Login or sign up in order to post.