输入或文件打开后的分段错误

时间:2017-04-02 08:18:19

标签: c file file-io segmentation-fault

我必须创建一个读取两个文件并进行比较的程序。但我陷入了这个部分:我将文件指针发送到一个函数,该函数从键盘收集文件的名称并打开它们。它发生成功,然后毁了它!

在某个地方读取第二个文件的名称或之后出现错误。我试图从打开它的函数中的文件2中打印出一些东西并且它有效。出现两个不同的问题:分段错误没有任何反应,终端的光标一直闪烁,我需要ctrl+c停止运行

这是我的代码。

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

#define TAM_PALAVRA 46 // Maior palavra do português possui 46 letras
#define TAM_ARQUIVO 50

/* *** Funções *** */
void apresentacao();
int abrirArquivos(FILE *arquivo1, FILE *arquivo2);
void fecharArquivos(FILE *arquivo1, FILE *arquivo2);

/* *** main *** */
/* Corpo do programa */
int main() {
    /* Variáveis */
    FILE *arquivo1;
    FILE *arquivo2;
    int flag = 0; // Variável de controle - 1 para arquivos inexistentes e 0 para arquivos abertos com sucesso

    /* Função para que o programa aceite caracteres da língua portuguesa */
    setlocale(LC_ALL, "Portuguese");

    /* Looping para garantir a correta abertura do programa */
    do {
        apresentacao();
        if(flag == 1) {
            printf("\tO ARQUIVO DIGITADO NÃO EXISTE. TENTE NOVAMENTE.\n\n");
        }
        flag = abrirArquivos(arquivo1, arquivo2); // Abrindo os arquivos necessários
    } while(flag);

    /* Liberando a memória */
    fecharArquivos(arquivo1, arquivo2);

    return 0;
}

/* *** apresentacao *** */
/* Explica para o usuário o que o programa faz */
void apresentacao() {
    system("clear");
    printf("\n\n\tProjeto 02 - Estruturas de Dados - Turma C");
    printf("\n\tUnB - Universidade de Brasília");
    printf("\n\tAluno: Sérgio de Castilho Mafra");
    printf("\n\tMatrícula: 08/40769");
    printf("\n\n\tCOMPARADOR DE TEXTOS");
    printf("\n\n\t\tEste programa comparará dois textos fornecidos por você, usuário,\n\te imprimirá na tela um valor que representa quão parecidos os textos são.\n\tAcima de 50%%, os textos serão considerados plágio.\n\n");
}

/* *** abrirArquivos *** */
/* Coleta do usuário os nomes dos arquivos e os abre */
int abrirArquivos(FILE *arquivo1, FILE *arquivo2) {
    char arq1[TAM_ARQUIVO+1], arq2[TAM_ARQUIVO+1];

    /* Coletando o nome dos arquivos e verificando a existência dos mesmos */
    // Arquivo 1
    printf("\tDigite o nome do primeiro arquivo: ");
    fgets(arq1, TAM_ARQUIVO, stdin);
    arq1[strlen(arq1)-1] = '\0';

    if((arquivo1 = fopen(arq1, "r")) == NULL) {
        return 1;
    }

    // Arquivo 2
    printf("\tAgora, digite o nome do segundo: ");
    fgets(arq2, TAM_ARQUIVO, stdin);
    arq2[strlen(arq2)-1] = '\0';

    if((arquivo2 = fopen(arq2, "r")) == NULL) {
        return 1;
    }

    char w[200];
    printf("\n\n\t\t%s\n\n", fgets(w, 199, arquivo2));

    // Flag 0, se os arquivos forem abertos com sucesso
    return 0;
}

void fecharArquivos(FILE *arquivo1, FILE *arquivo2) {
    fclose(arquivo1);
    fclose(arquivo2);
}

0 个答案:

没有答案