Ir ao conteúdo

C Como resolver manipulacao de arquivos em C


Posts recomendados

Postado

Ola, eu estou fazendo um trabalho pra faculdade e estou com um problema no meu codigo, quando chamo a funcao 7 de carregar um arquivo e quero adcionar os itens desse arquivo na minha lista, ele salva todos com o mesmo nome do ultimo elemtno do arquivo arquivo

 

segue meu codigo

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <time.h>





//!Variáveis

int cont = 0;

int tt_blocos; int bloco = 0; int qt_blocos = 1; int esp_livre; //Variáveis dos Blocos de Tweets

int qt_tweets = 0; char tweets[281] = "\0"; //Variáveis dos Tweets

int opcao, tamanho, tam_2; //Variáveis do Menu

char nome_arquivo[50] = "\0"; //Variáveis do Menu



//!Arquivo



FILE *arquivo;

FILE *arquivo2;




//!Ponteiro

typedef struct bloco{

    char **tweets;

    int alocao_tt;

    struct bloco *prox;}Bloco;

Bloco *inicio = NULL;

Bloco *fim = NULL;



typedef struct tag{ //MUDAR

    char tag[50];

    int quantidade;

    struct tag * prox;

}TAG;

TAG * inicioTag = NULL;

TAG * fimTag = NULL;




Bloco* blocos_dinamicos(){

    Bloco* novo_bloco = malloc(sizeof(Bloco));

    novo_bloco->prox = NULL;

    novo_bloco->tweets = malloc(tt_blocos * sizeof(char*));



    for (int j = 0; j < tt_blocos; ++j){

        novo_bloco->tweets[j] = (char *)malloc(281);

        novo_bloco->tweets[j] = "\0";}

    if(inicio == NULL){

        inicio = novo_bloco;

        fim = novo_bloco;}

    else{

        fim->prox = novo_bloco;

        fim = novo_bloco;}

    return novo_bloco;}




//!0 - Função Contador

void contador(){

    cont++;

    qt_tweets++;



    while(cont == tt_blocos){

        cont = 0;

        bloco++;

        qt_blocos++;}}




//!1 - Função de Tweetar

void adcionar_tweets(){

    char frase[281] = "\0";



    printf("===============================================\n");

    printf("              Funcao Tweetar\n");

    printf("===============================================\n");

    printf("O que voce deseja tuitar?\n\n");

    printf("Insira: ");

    fflush(stdin);

    scanf("%[^\n]s",frase);



    tamanho = strlen(frase);

    tam_2 = tamanho - 281;



    while(tamanho > 281){

        printf("\n!!O seu tweet ultrapassou o maximo de 280 caracteres!!\nTweet novamente com %d caracteres a menos!!\n", tam_2);

        fflush(stdin);

        scanf("%[^\n]s",frase);

        tamanho = strlen(frase);

        tam_2 = tamanho - 281;}

        printf("-----------------------------------------------\n");

        tweetar(frase);

        //verificar_hastag(frase);

        menu();}




void tweetar(char* frase[281]){

    Bloco* novo_bloco = blocos_dinamicos();

    novo_bloco->tweets[cont] = frase;

    contador();}



//!2 - Função de Listar

void listar(){

    Bloco* aux = inicio;

    int j = 0;

    int n = 0;



    printf("===============================================\n");

    printf("              Listando Tweets\n");

    printf("===============================================\n\n");



    if(aux == NULL){

        printf("não existem tweets na memoria :/\n");

        menu();}



    printf("BLOCO 0\n");

    for(aux = inicio; aux != NULL;aux = aux->prox){

        for(int i = 0; i < tt_blocos; i++){

            if(j == tt_blocos){j = 0;n++;

                printf("\nBLOCO %d\n",n);}

            printf("%s", aux->tweets[i]);}

            printf("\n");j++;}

            printf("-----------------------------------------------\n");

            menu();}




//!3 - Função de Filtrar Hashtag - Arrumar

void filtrar(){

    Bloco* aux = inicio;

    char hashtag[281];

    char *busca;

    int resul;



    printf("===============================================\n");

    printf("                 FILTRAR #\n");

    printf("===============================================\n\n");

    printf("Qual # que voce deseja procurar?\n");

    printf("Digite na forma #NOME: ");

    fflush(stdin);

    scanf("%s", hashtag);



    if(aux == NULL){

    printf("\nNao existem tweets com a %s\n",hashtag);}




    for(aux = inicio; aux != NULL; aux = aux->prox){

        for(int i = 0; i < tt_blocos; i++){

            busca = strstr(aux->tweets[i], hashtag);

            if(busca){

                printf("\nTweet: %s\n", aux->tweets[i]);}}}

            printf("\n----------------------------------------\n");

            menu();}




//!4 - Fazer função

//!Encontrar a tag



void verificar_hastag(char frase[]){

    int j = 0;

    char tweet_copiado[280];

    for (int i = 0; i < strlen(frase); i++){

        if (frase[i] == '#'){

            while (frase[i] != ' '){

                tweet_copiado[j] = frase[i];

                j++;

                i++;

            }

            printf("%s",tweet_copiado);

            j = 0;

        }

    }}







void adicionarHashtag(char * tag_nova){

    TAG * aux;

    int resul = 0;



    if ( inicioTag  == NULL){

        TAG* novaTag = malloc(sizeof(TAG));

        novaTag->prox = NULL;

        strcpy(novaTag->tag, tag_nova);

        novaTag->quantidade = 1;



        if(inicioTag == NULL){

            inicioTag = novaTag;

            fimTag = novaTag;}

            else{

            fimTag->prox = novaTag;

            fimTag = novaTag;}}

        else{

        for (aux = inicioTag; aux != NULL; aux = aux->prox){

            if(strcmp(tag_nova, aux->tag) == 0){

                aux->quantidade += 1;

                resul = 1;}}

        if (resul == 1){}

        else{

            TAG* novaTag = malloc(sizeof(TAG));

            novaTag->prox = NULL;

            strcpy(novaTag->tag, tag_nova);

            novaTag->quantidade = 1;



            if(inicioTag == NULL){

                inicioTag = novaTag;

                fimTag = novaTag;}

                else{

                fimTag->prox = novaTag;

                fimTag = novaTag;

            }

        }

    }

}



void listarTrendTopcs(){

    TAG * aux = inicioTag;

    printf("| %-20s %-5s |\n","Tags", "Qtd");

    for( aux = inicioTag; aux != NULL; aux = aux->prox){

        printf("| %-22s %-3d |\n",aux->tag, aux->quantidade);

    }

}





//!5 - Informações do Administrador -- Terminar Função 3

void adm(){



    int opcao;

    printf("Seja bem-vindo ADM!\nO que deseja ver hoje?\n");

    printf("1)Quantidade de tweets?\n2)Quantidade de blocos?\n3)Quantidade de hashtags?\n4)Espaco livre no ultimo bloco?\n5)Voltar ao menu?:\n");

    scanf("%d", &opcao);



        while(opcao < 1 || opcao > 5){

        printf("!!OPCAO INVALIDA!!\n");

        printf("O que dejesa ver?\n");

        printf("1)Quantidade de tweets?\n2)Quantidade de blocos?\n3)Quantidade de hashtags?\n4)Espaco livre no ultimo bloco?\n5)Voltar ao menu?:\n");

        scanf("%d", &opcao);}



        switch (opcao){



            case 1:

                if (qt_tweets == 1){

                printf("Existe 1 tweet na memoria!\n");}

                else{

                printf("Existem %d tweets na memoria!\n", qt_tweets);}

                printf("O que voce deseja?\n1)Continuar no Menu ADM\n2)Voltar ao menu principal\n");

                scanf("%d",&opcao);



                while(opcao < 1 || opcao > 2){

                printf("!!OPCAO INVALIDA!!\n");

                printf("O que voce deseja?\n1)Continuar no Menu ADM\n2)Voltar ao menu principal\n");

                scanf("%d", &opcao);}



                switch(opcao){

                case 1:

                    adm(); break;

                case 2:

                    menu(); break;}




            case 2:

                if(qt_blocos == 1){

                printf("Existe 1 bloco na memoria!\n");}

                else{

                printf("Existem %d blocos na memoria!\n", qt_blocos);}



                printf("O que voce deseja?\n1)Continuar no Menu ADM\n2)Voltar ao menu principal\n");

                scanf("%d",&opcao);



                while(opcao < 1 || opcao > 2){

                printf("!!OPCAO INVALIDA!!\n");

                printf("O que voce deseja?\n1)Continuar no Menu ADM\n2)Voltar ao menu principal\n");

                scanf("%d", &opcao);}



                switch(opcao){

                case 1:

                    adm(); break;

                case 2:

                    menu(); break;}





            case 3:

                printf("3\n");

                break;




            case 4:

                esp_livre = tt_blocos - cont;

                if (esp_livre == 0){

                    printf("O Bloco %d\n não tem mais espaco livre!\n", bloco);}

                else if(esp_livre == 1){

                    printf("O Bloco %d tem 1 espaco livre!\n", bloco);}

                else{

                    printf("O Bloco %d tem %d espacos livres!\n", bloco, esp_livre);}




                printf("O que voce deseja?\n1)Continuar no Menu ADM\n2)Voltar ao menu principal\n");

                scanf("%d",&opcao);



                while(opcao < 1 || opcao > 2){

                printf("!!OPCAO INVALIDA!!\n");

                printf("O que voce deseja?\n1)Continuar no Menu ADM\n2)Voltar ao menu principal\n");

                scanf("%d", &opcao);}



                switch(opcao){

                case 1:

                    adm(); break;

                case 2:

                    menu(); break;}




            case 5:

                printf("Voltando para o menu principal\n");

                menu();

                break;}}




//!6 - Salvar arquivos

void salvar(){

    Bloco* aux = inicio;



    char frase[281];

    printf("\n------------------------------\n");

    printf("Insira o nome do seu arquivo: ");

    scanf("%s",nome_arquivo);

    fflush(stdin);



    arquivo = fopen(nome_arquivo,"w");



    //Adcionar data e hora

    time_t seconds;

    struct tm *timeStruct;

    seconds = time(NULL);

    timeStruct = localtime(&seconds);

    time_t mytime;

    mytime = time(NULL);

    struct tm tm = *localtime(&mytime);



    fprintf(arquivo,"Data: %d/%d/%d ", tm.tm_mday, tm.tm_mon + 1, tm.tm_year + 1900);

    fprintf(arquivo,"Hora: %d:%d\n\n", timeStruct->tm_hour, timeStruct->tm_min);



    for(aux = inicio; aux != NULL;aux = aux->prox){

        for (int i = 0; i < tt_blocos; i++){

            fprintf(arquivo,"%s", aux->tweets[i]);}

            fprintf(arquivo,"\n");}

    fclose(arquivo);

    printf("\n------------------------------\n");

    menu();}




//!7 - Carregar arquivos - ARRUMAR

void carregar_arquivos(){

    char nome_arquivo[20];

    char frase[281] = "\0";

    int opcao;



    printf("\n------------------------------\n");

    printf("Insira o nome do arquivo que deseja carregar: ");

    fflush(stdin);

    scanf("%s",nome_arquivo);

    arquivo2 = fopen(nome_arquivo,"r");



    while (arquivo2==NULL){

        printf("\nEsse aqurivo não existe!!!");

        printf("\nInsira um nome de arquivo valido: ");

        scanf("%s",nome_arquivo);

        arquivo2 = fopen(nome_arquivo,"r");}





    printf("\n\nImprimindo Arquivo...\n");

    arquivo2 = fopen(nome_arquivo,"r");



    while(fgets(frase,281,arquivo2) != NULL){

        printf("%s",frase);}

    printf("\n\n");



    printf("O que voce deseja fazer?\n[1]Adcionar esses Tweets junto aos existentes\n[2]Zerar a lista e adcionar os tweets desse arquivo: \n");

    scanf("%d",&opcao);




    while(opcao < 1 || opcao > 2){

        printf("!!OPCAO INVALIDA!!\n");

        printf("O que dejesa fazer?\n");

        printf("O que voce deseja fazer?\n[1]Adcionar esses Tweets junto aos existentes\n[2]Zerar a lista e adcionar os tweets desse arquivo: \n");

        scanf("%d", &opcao);}




    if(opcao == 1){

        arquivo2 = fopen(nome_arquivo, "r");

        while(fgets(frase, 281, arquivo2) != NULL){

            tweetar(frase);

       

        }

    }



            menu();

}







//!Menu

void menu(){

    int opcao;

        printf("O que dejesa fazer?\n");

        printf("[1]Fazer um tweet\n[2]Listar todos seus tweets\n[3]Filtrar uma hastag?(#)\n[4]Listar os Treding Topics\n[5]Entrar nas informações de Administrador\n[6]Salvar seus tweets\n[7]Carregar um arquivo\n[8]Sair: ");

        scanf("%d", &opcao);



        while(opcao < 1 || opcao > 8){

            printf("!!OPCAO INVALIDA!!\n");

            printf("O que dejesa fazer?\n");

            printf("[1]Fazer um tweet\n[2]Listar todos seus tweets\n[3]Filtrar uma hastag?(#)\n[4]Listar os Treding Topics\n[5]Entrar nas informações de Administrador\n[6]Salvar seus tweets\n[7]Carregar um arquivo\n[8]Sair: ");

            scanf("%d", &opcao);}



    switch(opcao){

    case 1:

        adcionar_tweets();

        break;

    case 2:

        listar();

        break;

    case 3:

        filtrar();

        break;

    case 4: //Fazer

        listarTrendTopcs();

        break;

    case 5:

        adm();

        break;

    case 6:

        salvar();

        break;

    case 7:

        carregar_arquivos();

        break;

    case 8:

        printf("Obrigado, ate logo!");

        break;}}



int main(){

    printf("Seja bem-vindo(a) ao 'Twitter Lite'\nQuantos Tweets voce deseja ter por bloco?\n");

    scanf("%d",&tt_blocos);

    menu();}

 

Postado

Use o botão code como explicado no primeiro post do forum.

 

Veja a diferença:

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
//! Variáveis
int  cont = 0;
int  tt_blocos;
int  bloco     = 0;
int  qt_blocos = 1;
int  esp_livre;  // Variáveis dos Blocos de Tweets
int  qt_tweets   = 0;
char tweets[281] = "\0";       // Variáveis dos Tweets
int  opcao, tamanho, tam_2;    // Variáveis do Menu
char nome_arquivo[50] = "\0";  // Variáveis do Menu
//! Arquivo
FILE* arquivo;
FILE* arquivo2;
//! Ponteiro
typedef struct bloco
{
    char**        tweets;
    int           alocao_tt;
    struct bloco* prox;
} Bloco;
Bloco* inicio = NULL;
Bloco* fim    = NULL;
typedef struct tag
{  // MUDAR
    char        tag[50];
    int         quantidade;
    struct tag* prox;
} TAG;
TAG*   inicioTag = NULL;
TAG*   fimTag    = NULL;
Bloco* blocos_dinamicos()
{
    Bloco* novo_bloco  = malloc(sizeof(Bloco));
    novo_bloco->prox   = NULL;
    novo_bloco->tweets = malloc(tt_blocos * sizeof(char*));
    for (int j = 0; j < tt_blocos; ++j)
    {
        novo_bloco->tweets[j] = (char*)malloc(281);
        novo_bloco->tweets[j] = "\0";
    }
    if (inicio == NULL)
    {
        inicio = novo_bloco;
        fim    = novo_bloco;
    }
    else
    {
        fim->prox = novo_bloco;
        fim       = novo_bloco;
    }
    return novo_bloco;
}
//! 0 - Função Contador
void contador()
{
    cont++;
    qt_tweets++;
    while (cont == tt_blocos)
    {
        cont = 0;
        bloco++;
        qt_blocos++;
    }
}
//! 1 - Função de Tweetar
void adcionar_tweets()
{
    char frase[281] = "\0";
    printf(
        "==============================================="
        "\n");
    printf("              Funcao Tweetar\n");
    printf(
        "==============================================="
        "\n");
    printf("O que voce deseja tuitar?\n\n");
    printf("Insira: ");
    fflush(stdin);
    scanf("%[^\n]s", frase);
    tamanho = strlen(frase);
    tam_2   = tamanho - 281;
    while (tamanho > 281)
    {
        printf(
            "\n!!O seu tweet ultrapassou o maximo de 280 "
            "caracteres!!\nTweet novamente com %d "
            "caracteres a menos!!\n",
            tam_2);
        fflush(stdin);
        scanf("%[^\n]s", frase);
        tamanho = strlen(frase);
        tam_2   = tamanho - 281;
    }
    printf(
        "-----------------------------------------------"
        "\n");
    tweetar(frase);
    // verificar_hastag(frase);
    menu();
}
void tweetar(char* frase[281])
{
    Bloco* novo_bloco        = blocos_dinamicos();
    novo_bloco->tweets[cont] = frase;
    contador();
}
//! 2 - Função de Listar
void listar()
{
    Bloco* aux = inicio;
    int    j   = 0;
    int    n   = 0;
    printf(
        "==============================================="
        "\n");
    printf("              Listando Tweets\n");
    printf(
        "==============================================="
        "\n\n");
    if (aux == NULL)
    {
        printf("não existem tweets na memoria :/\n");
        menu();
    }
    printf("BLOCO 0\n");
    for (aux = inicio; aux != NULL; aux = aux->prox)
    {
        for (int i = 0; i < tt_blocos; i++)
        {
            if (j == tt_blocos)
            {
                j = 0;
                n++;
                printf("\nBLOCO %d\n", n);
            }
            printf("%s", aux->tweets[i]);
        }
        printf("\n");
        j++;
    }
    printf(
        "-----------------------------------------------"
        "\n");
    menu();
}
//! 3 - Função de Filtrar Hashtag - Arrumar
void filtrar()
{
    Bloco* aux = inicio;
    char   hashtag[281];
    char*  busca;
    int    resul;
    printf(
        "==============================================="
        "\n");
    printf("                 FILTRAR #\n");
    printf(
        "==============================================="
        "\n\n");
    printf("Qual # que voce deseja procurar?\n");
    printf("Digite na forma #NOME: ");
    fflush(stdin);
    scanf("%s", hashtag);
    if (aux == NULL)
    {
        printf("\nNao existem tweets com a %s\n", hashtag);
    }
    for (aux = inicio; aux != NULL; aux = aux->prox)
    {
        for (int i = 0; i < tt_blocos; i++)
        {
            busca = strstr(aux->tweets[i], hashtag);
            if (busca)
            {
                printf("\nTweet: %s\n", aux->tweets[i]);
            }
        }
    }
    printf("\n----------------------------------------\n");
    menu();
}
//! 4 - Fazer função
//! Encontrar a tag
void verificar_hastag(char frase[])
{
    int  j = 0;
    char tweet_copiado[280];
    for (int i = 0; i < strlen(frase); i++)
    {
        if (frase[i] == '#')
        {
            while (frase[i] != ' ')
            {
                tweet_copiado[j] = frase[i];
                j++;
                i++;
            }
            printf("%s", tweet_copiado);
            j = 0;
        }
    }
}
void adicionarHashtag(char* tag_nova)
{
    TAG* aux;
    int  resul = 0;
    if (inicioTag == NULL)
    {
        TAG* novaTag  = malloc(sizeof(TAG));
        novaTag->prox = NULL;
        strcpy(novaTag->tag, tag_nova);
        novaTag->quantidade = 1;
        if (inicioTag == NULL)
        {
            inicioTag = novaTag;
            fimTag    = novaTag;
        }
        else
        {
            fimTag->prox = novaTag;
            fimTag       = novaTag;
        }
    }
    else
    {
        for (aux = inicioTag; aux != NULL; aux = aux->prox)
        {
            if (strcmp(tag_nova, aux->tag) == 0)
            {
                aux->quantidade += 1;
                resul = 1;
            }
        }
        if (resul == 1) {}
        else
        {
            TAG* novaTag  = malloc(sizeof(TAG));
            novaTag->prox = NULL;
            strcpy(novaTag->tag, tag_nova);
            novaTag->quantidade = 1;
            if (inicioTag == NULL)
            {
                inicioTag = novaTag;
                fimTag    = novaTag;
            }
            else
            {
                fimTag->prox = novaTag;
                fimTag       = novaTag;
            }
        }
    }
}
void listarTrendTopcs()
{
    TAG* aux = inicioTag;
    printf("| %-20s %-5s |\n", "Tags", "Qtd");
    for (aux = inicioTag; aux != NULL; aux = aux->prox)
    {
        printf(
            "| %-22s %-3d |\n", aux->tag, aux->quantidade);
    }
}
//! 5 - Informações do Administrador -- Terminar Função 3
void adm()
{
    int opcao;
    printf("Seja bem-vindo ADM!\nO que deseja ver hoje?\n");
    printf(
        "1)Quantidade de tweets?\n2)Quantidade de "
        "blocos?\n3)Quantidade de hashtags?\n4)Espaco "
        "livre no ultimo bloco?\n5)Voltar ao menu?:\n");
    scanf("%d", &opcao);
    while (opcao < 1 || opcao > 5)
    {
        printf("!!OPCAO INVALIDA!!\n");
        printf("O que dejesa ver?\n");
        printf(
            "1)Quantidade de tweets?\n2)Quantidade de "
            "blocos?\n3)Quantidade de hashtags?\n4)Espaco "
            "livre no ultimo bloco?\n5)Voltar ao menu?:\n");
        scanf("%d", &opcao);
    }
    switch (opcao)
    {
        case 1:
            if (qt_tweets == 1)
            {
                printf("Existe 1 tweet na memoria!\n");
            }
            else
            {
                printf(
                    "Existem %d tweets na memoria!\n",
                    qt_tweets);
            }
            printf(
                "O que voce deseja?\n1)Continuar no Menu "
                "ADM\n2)Voltar ao menu principal\n");
            scanf("%d", &opcao);
            while (opcao < 1 || opcao > 2)
            {
                printf("!!OPCAO INVALIDA!!\n");
                printf(
                    "O que voce deseja?\n1)Continuar no "
                    "Menu ADM\n2)Voltar ao menu "
                    "principal\n");
                scanf("%d", &opcao);
            }
            switch (opcao)
            {
                case 1:
                    adm();
                    break;
                case 2:
                    menu();
                    break;
            }
        case 2:
            if (qt_blocos == 1)
            {
                printf("Existe 1 bloco na memoria!\n");
            }
            else
            {
                printf(
                    "Existem %d blocos na memoria!\n",
                    qt_blocos);
            }
            printf(
                "O que voce deseja?\n1)Continuar no Menu "
                "ADM\n2)Voltar ao menu principal\n");
            scanf("%d", &opcao);
            while (opcao < 1 || opcao > 2)
            {
                printf("!!OPCAO INVALIDA!!\n");
                printf(
                    "O que voce deseja?\n1)Continuar no "
                    "Menu ADM\n2)Voltar ao menu "
                    "principal\n");
                scanf("%d", &opcao);
            }
            switch (opcao)
            {
                case 1:
                    adm();
                    break;
                case 2:
                    menu();
                    break;
            }
        case 3:
            printf("3\n");
            break;
        case 4:
            esp_livre = tt_blocos - cont;
            if (esp_livre == 0)
            {
                printf(
                    "O Bloco %d\n não tem mais espaco "
                    "livre!\n",
                    bloco);
            }
            else if (esp_livre == 1)
            {
                printf(
                    "O Bloco %d tem 1 espaco livre!\n",
                    bloco);
            }
            else
            {
                printf(
                    "O Bloco %d tem %d espacos livres!\n",
                    bloco, esp_livre);
            }
            printf(
                "O que voce deseja?\n1)Continuar no Menu "
                "ADM\n2)Voltar ao menu principal\n");
            scanf("%d", &opcao);
            while (opcao < 1 || opcao > 2)
            {
                printf("!!OPCAO INVALIDA!!\n");
                printf(
                    "O que voce deseja?\n1)Continuar no "
                    "Menu ADM\n2)Voltar ao menu "
                    "principal\n");
                scanf("%d", &opcao);
            }
            switch (opcao)
            {
                case 1:
                    adm();
                    break;
                case 2:
                    menu();
                    break;
            }
        case 5:
            printf("Voltando para o menu principal\n");
            menu();
            break;
    }
}
//! 6 - Salvar arquivos
void salvar()
{
    Bloco* aux = inicio;
    char   frase[281];
    printf("\n------------------------------\n");
    printf("Insira o nome do seu arquivo: ");
    scanf("%s", nome_arquivo);
    fflush(stdin);
    arquivo = fopen(nome_arquivo, "w");
    // Adcionar data e hora
    time_t     seconds;
    struct tm* timeStruct;
    seconds    = time(NULL);
    timeStruct = localtime(&seconds);
    time_t mytime;
    mytime       = time(NULL);
    struct tm tm = *localtime(&mytime);
    fprintf(
        arquivo, "Data: %d/%d/%d ", tm.tm_mday,
        tm.tm_mon + 1, tm.tm_year + 1900);
    fprintf(
        arquivo, "Hora: %d:%d\n\n", timeStruct->tm_hour,
        timeStruct->tm_min);
    for (aux = inicio; aux != NULL; aux = aux->prox)
    {
        for (int i = 0; i < tt_blocos; i++)
        {
            fprintf(arquivo, "%s", aux->tweets[i]);
        }
        fprintf(arquivo, "\n");
    }
    fclose(arquivo);
    printf("\n------------------------------\n");
    menu();
}
//! 7 - Carregar arquivos - ARRUMAR
void carregar_arquivos()
{
    char nome_arquivo[20];
    char frase[281] = "\0";
    int  opcao;
    printf("\n------------------------------\n");
    printf(
        "Insira o nome do arquivo que deseja carregar: ");
    fflush(stdin);
    scanf("%s", nome_arquivo);
    arquivo2 = fopen(nome_arquivo, "r");
    while (arquivo2 == NULL)
    {
        printf("\nEsse aqurivo não existe!!!");
        printf("\nInsira um nome de arquivo valido: ");
        scanf("%s", nome_arquivo);
        arquivo2 = fopen(nome_arquivo, "r");
    }
    printf("\n\nImprimindo Arquivo...\n");
    arquivo2 = fopen(nome_arquivo, "r");
    while (fgets(frase, 281, arquivo2) != NULL)
    {
        printf("%s", frase);
    }
    printf("\n\n");
    printf(
        "O que voce deseja fazer?\n[1]Adcionar esses "
        "Tweets junto aos existentes\n[2]Zerar a lista e "
        "adcionar os tweets desse arquivo: \n");
    scanf("%d", &opcao);
    while (opcao < 1 || opcao > 2)
    {
        printf("!!OPCAO INVALIDA!!\n");
        printf("O que dejesa fazer?\n");
        printf(
            "O que voce deseja fazer?\n[1]Adcionar esses "
            "Tweets junto aos existentes\n[2]Zerar a lista "
            "e adcionar os tweets desse arquivo: \n");
        scanf("%d", &opcao);
    }
    if (opcao == 1)
    {
        arquivo2 = fopen(nome_arquivo, "r");
        while (fgets(frase, 281, arquivo2) != NULL)
        {
            tweetar(frase);
        }
    }
    menu();
}
//! Menu
void menu()
{
    int opcao;
    printf("O que dejesa fazer?\n");
    printf(
        "[1]Fazer um tweet\n[2]Listar todos seus "
        "tweets\n[3]Filtrar uma hastag?(#)\n[4]Listar os "
        "Treding Topics\n[5]Entrar nas informações de "
        "Administrador\n[6]Salvar seus tweets\n[7]Carregar "
        "um arquivo\n[8]Sair: ");
    scanf("%d", &opcao);
    while (opcao < 1 || opcao > 8)
    {
        printf("!!OPCAO INVALIDA!!\n");
        printf("O que dejesa fazer?\n");
        printf(
            "[1]Fazer um tweet\n[2]Listar todos seus "
            "tweets\n[3]Filtrar uma hastag?(#)\n[4]Listar "
            "os Treding Topics\n[5]Entrar nas informações "
            "de Administrador\n[6]Salvar seus "
            "tweets\n[7]Carregar um arquivo\n[8]Sair: ");
        scanf("%d", &opcao);
    }
    switch (opcao)
    {
        case 1:
            adcionar_tweets();
            break;
        case 2:
            listar();
            break;
        case 3:
            filtrar();
            break;
        case 4:  // Fazer
            listarTrendTopcs();
            break;
        case 5:
            adm();
            break;
        case 6:
            salvar();
            break;
        case 7:
            carregar_arquivos();
            break;
        case 8:
            printf("Obrigado, ate logo!");
            break;
    }
}
int main()
{
    printf(
        "Seja bem-vindo(a) ao 'Twitter Lite'\nQuantos "
        "Tweets voce deseja ter por bloco?\n");
    scanf("%d", &tt_blocos);
    menu();
}

 

Sobre o código

 

Seu programa não está bom. Vai ter muito trabalho em concluir assim, ou mesmo testar ou mudar algo. Parece ser um padrão de como ensinam isso nesses tempos porque praticamente todos os programas tem essas soluções, digamos, menos boas...

 

Veja main() por exemplo

 

int main()
{
    printf(
        "Seja bem-vindo(a) ao 'Twitter Lite'\nQuantos "
        "Tweets voce deseja ter por bloco?\n");
    scanf("%d", &tt_blocos);
    menu();
}

 

main deve ser a primeira função de seu programa. Se possível em um arquivo separado.

 

Onde está a lógica de seu programa?

 

Desaparecida, oculta dentro de menu. Não é boa ideia.

 

funções devem ter um objetivo específico. menu() deve apresentar um menu e, claro, RETORNAR a opção. Só isso. Uma responsabilidade.

 

Quando você vai rodar o programa imagino que já saiba quantos tweets vai ter por bloco.

 

Então não é chato pra c. mandar rodar o programa para ele perguntar isso e depois você teclar esse valor e um ENTER para afinal ver o meu?

 

E provavelmente já sabe tambem o nome do arquivo e talvez já pudesse carregar o arquivo antes do tal menu...

 

Não parece ser muito útil o programa sem carregar um arquivo então porque não começa com esse argumentos?

 

	programa 12 tweets.txt

 

 

Não seria mais produtivo? Já dizer que são 12 tweets por bloco e carregar o que tiver de tweets.txt? E se vier apenas o número ir direto para o menu e ficar esperando???

 

    printf(
        "[1]Fazer um tweet\n[2]Listar todos seus "
        "tweets\n[3]Filtrar uma hastag?(#)\n[4]Listar os "
        "Treding Topics\n[5]Entrar nas informações de "
        "Administrador\n[6]Salvar seus tweets\n[7]Carregar "
        "um arquivo\n[8]Sair: ");

 

Não escreva assim. Mal dá pra ler... Compare

 

    printf(
        "\
[1]Fazer um tweet\n\
[2]Listar todos seus tweets\n\
[3]Filtrar uma hastag?(#)\n\
[4]Listar os Treding Topics\n\
[5]Entrar nas informações de Administrador\n\
[6]Salvar seus tweets\n\
[7]Carregar um arquivo\n\
\n\
[8]Sair: ");

 

Faça o simples.

 

    scanf("%d", &opcao);
    while (opcao < 1 || opcao > 8)

 

provavelmente scanf() não é uma boa opção para ler opções do menu.

 

Se vai usar leia o manual: TESTE sempre o retorno de scanf(). É ingênuo seguir sem testar. Em especial em um programa de iniciante, que pode simplemsmetne mandar encerrar a qualquer momento.

 

            listarTrendTopcs();

 

o nome já está BEM grande, então talvez pudesse escrever TrendingTopics e não correr o risco de esquecer como abreviou e dar erro na compilação...

 

    //! Variáveis
int  cont = 0;
int  tt_blocos;
int  bloco     = 0;
int  qt_blocos = 1;
int  esp_livre;  // Variáveis dos Blocos de Tweets
int  qt_tweets   = 0;
char tweets[281] = "\0";       // Variáveis dos Tweets
int  opcao, tamanho, tam_2;    // Variáveis do Menu
char nome_arquivo[50] = "\0";  // Variáveis do Menu

 

 

Todas essas variáveis são globais. Isso é um desastre e é proibido em toda parte, escolas e empresas. 

 

USE argumentos. Retorne valores

 

Evite comentários óbvios como

 

    //! Variáveis

 

Dá pra imaginar que são declarações de variáveis. 

 

Comente o que está fazendo e porque está fazendo.

 

Evite acentos em comentários. Podem sair zoados na tela de outros que estão tentando te ajudar. E pouco acrescentam os acentos...

 

Veja o que eu escrevi sobre o que eu imagino que seja esse programa em https://pt.stackoverflow.com/questions/541190/criando-uma-fila-encadeada-com-matriz-de-char-dentro-da-scruct/541992#541992

 

Esse trecho de código

 

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

typedef struct
{
    char txt[281];
} Tweet; // um tweet

    typedef struct
{
    int     N;  // quantos?
    Tweet** tweet;
}   Tweets; // o bloco

typedef Tweets Dado;  // essa lista e de Tweets

typedef struct st_node
{
    struct st_node* ant;
    struct st_node* prox;
    Dado*           D;
} Node; // um no da lista, que aponta para um Dado

typedef struct
{
    size_t size;
    size_t limite;

    Node* ini;
    Node* fim;
} Lista;

Lista* l_apaga(Lista*);
Lista* l_cria(int);
int    l_insere(Dado*, Lista*);
int    l_mostra(Lista*, const char*);

Tweets* t_apaga(Tweets*);
Tweets* t_gera(int);
int     t_mostra(Tweets* twe);


int main(void) { return 0; };

 

pode servir para comparar.

 

Entenda que os tweets não fazem parte da lista. Se misturar só vai ter mais trabalho.

 

void adcionar_tweets()
{
    char frase[281] = "\0";
...

 

Não escreva assim. Essa seria uma string com dois 0. Faça o simples e escreva 

 

    char frase[281] = 0;

 

0 é isso, zero.

 

        fflush(stdin);

 

Não use flush na entrada. Sequer está definido. 

 

Apenas consuma os dados direito e nunca vai precisar disso.

 

    tweetar(frase);

 

Declarou tweetar() como

 

void tweetar(char* frase[281])

 

E claro que está errado. Essa função recebe um vetor de 281 ponteiros para char. Dentro dela frase[0] é um ponteiro.

 

Na sua função menu frase[0] é uma letrinha, um char.

 

Escreva em torno dos dados. É muito mais fácil.

 

Ainda sobre o programa:

 

  • Use protótipos.
  • Teste em separado, Não tene escrever o programa todo de uma vez. Não é nada produtivo.
  • poste seu projeto, o enunciado. Ajude os outros a entenderem o que o programa deve fazer.

 

 

 

 

Arquivos em C

 

Essa linguagem foi escrita para escrever um sistema, que foi chamado de Unix. E hoje tem muitos derivados, como o Linux, o MacOS e o Android.

 

Em C tudo é arquivo. E arquivos são manipulados através de ponteiros. Então manipular arquivos em C é trivial: os caras que escreveram a linguagem não iam jogar contra si e fazer isso difícil. Eles eram/são dos melhores desenvolvedores de software de nossa época. E antes dessa época não havia software 🙂 

 

No seu caso talvez não devesse usar texto mas sim registros de tamanho fixo. E talvez devesse testar com tweets menores, nem 280 em 140 mas algo como 10. Facilite as coisas para você mesmo.

 

E se está alocando memória outra opção seria gravar apenas o que usa em cada tweet ao invés de alocar 280 para TODOS.

 

 

  • Curtir 1
  • Obrigado 1
Postado

@arfneto Muito obrigado pelas dicas, vou usar em proximos trabalhos!
Em relação a iniciar com um numero de tweets por blocos fixo,  tamanho de 280 e perguntar se o usuario quer ou não carregar os tweets do arquivo, são restrições obrigatórias no trabalho, as outras dicas vou adaptar aqui.
em relação ao meu problema com arquivos, ainda não conseguir resolver, o problema está quando vou adicionar na lista, meio que ele substitui o valor dos outros que estão na lista

Postado
1 hora atrás, luisfranklinn disse:

Muito obrigado pelas dicas, vou usar em proximos trabalhos!

 

 

Use nesse e vai perder menos tempo testando e escrevendo. Seu programa já está com mais de 500 linhas e não está bom. Nem compila direito. E não favorece a testar NADA em separado.

 

1 hora atrás, luisfranklinn disse:

Em relação a iniciar com um numero de tweets por blocos fixo,  tamanho de 280 e perguntar se o usuario quer ou não carregar os tweets do arquivo, são restrições obrigatórias no trabalho

 

São parâmetros apenas e fariam sua vida muito mais fácil se usasse como eu disse. Se não vem nenhum parâmetro não faz diferença. Se uma constante vale 5 ou 280 não faz diferença também. Se vem 1 ou 2 parâmetros você ganha talvez um minuto e economiza uma frustração em cada teste por ter que esperar para digitar o que você já sabe...

 

1 hora atrás, luisfranklinn disse:

em relação ao meu problema com arquivos, ainda não conseguir resolver, o problema está quando vou adicionar na lista, meio que ele substitui o valor dos outros que estão na lista

 

Como eu disse, sua estrutura não está boa. Não misture os dados com a lista ou vai ter mesmo dificuldade em testar. Leu ao menos o código que eu te mostrei?

 

1 hora atrás, luisfranklinn disse:

o problema está quando vou adicionar na lista, meio que ele substitui o valor dos outros que estão na lista

 

Como está misturado não pode testar em separado e não sabe de imediato se o erro está na inserção ou na leitura do arquivo...

 

 

Entendeu o que eu disse sobre usar registros de tamanho fixo e NÃO texto?

 

TEM ou NÃO TEM um enunciado? Porque não posta?

  • Curtir 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...