Ir para conteúdo
Fórum Script Brasil
  • 0

Duvida de como fazer entrada de dados através de um arquivo de texto!


Thiago Freitas

Pergunta

alguém ajuda ai pf?

Comecei a estudar computaçao esse semestre e estou com dificuldades de fazer certas coisas na linguagem em C.

Como posso fazer entrada de dados através de um arquivo de textos de duas colunas. Tipo tenho que mostrar os numeros recebidos ordenados, mas não sei como fazer para entrada de dados em um arquivo de texto de duas colunas, estou confuso se alguém puder me ajudar estarei muito grato!

Obrigado

Link para o comentário
Compartilhar em outros sites

6 respostass a esta questão

Posts Recomendados

  • 0

Certo, irei explicar melhor o que eu não entendi, tenho que fazer uma avalicao (benchmark) de algoritmos de ordenacao, ateh ai td bem, conheco alguns. Mas o problema é que a entrada de dados tem que ser atraves de um arquivo de texto de duas colunas, ou seja, tenho que organizar o que foi recebido nas colunas do arquivo de texto e não sei como faco para pegar os numeros q estao nesse arquivo com a finalidade de ordenar-los, espero que tenha ficado mais claro :)

Link para o comentário
Compartilhar em outros sites

  • 0

ok a ver se entendi? O arquivo é algo parecido a isso:

11 42
43 44
75 45
...

Se for assim de uma mostra, ou incluso se puder colar umas duas ou três linhas desse arquivo seria melhor.

Também precisaria saber se você vai carregar o arquivo inteiro na memória para organizar ele ou você organizaria ele no mesmo arquivo ou em outro arquivo diferente etc. Vou dar uma dica... se o arquivo for muito grande melhor organizar ele no mesmo arquivo ou em outro, porem se for poucas linhas pode carregar ele na memória, será mais fácil assim, porem não será o correto, o correto é sempre prescindir da memória e preferir arquivos. Imaginou subir toda a BD do facebook na sua RAM?kkkk.

Link para o comentário
Compartilhar em outros sites

  • 0

Mal a demora para responder, mas vamos la. Agora coloquei o programa que eu fiz, sei que esta errado principalmente nas partes dos arquivos, mas ta mais facil de entender o como eu quero que seja. Queria que a pessoa criasse um arquivo com os numeros em 2 colunas do jeito que ela querer, em um numero de linha determinado por ela. Ex:

 

12      19

5        23

52      2

...

 

Apos isso queria abrir esse arquivo e ler os numeros dele que vao estar em string em int, para poder realizar a ordenacao destes usando selection sort nesse caso, mostrando na memoria eles ordenados e a quantidade de passos necessarios para fazer isso. Ex: 2 - 5 - 12 - 19 - 23 - 52...  feito em n passos.

Bom, segue o codigo, espero que você possa me ajudar

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

int passos = 0;

//Funcao selection sort para organizar os numeros do arquivo
void selecao (int Vet[], int n){

    int Menor, aux;
    int i, j;

    for (i = 0; i < n; i++){
        Menor = i;
        for (j = i+1; j < n; j++){
            if (Vet[Menor] > Vet[j])
                Menor = j;
                passos++;
        }
        if (i != Menor){
            aux = Vet;
            Vet = Vet[Menor];
            Vet[Menor] = aux;
            passos++;
        }
    }
}

int main(){

    int t, k, l;

    //criando um arquivo e receber os numeros desejados
    printf("Quantas linhas possuira o arquivo?");
    scanf("%d", &t);

    FILE *fp1 = fopen("ProjetoComp.txt","w");

    if(fp1 == NULL){
        printf("não foi possivel abrir o arquivo\n");
        getchar();
        return 0;
    }

    int matriz[t][2];

    for (k = 0; k < t;  k++){
        printf("Informe os elementos da %da. linha:\n", (k+1));
        for (l = 0; l < 2; l++){
            scanf("%d", &matriz[k][l]);
            fprintf(fp1,"%d\t");
        }
        printf("\n");
    }

    fclose(fp1);

    //abrindo o arquivo criado para ler e realizar a ordenacao
    FILE *fp2 = fopen("ProjetoComp.txt","r");

    char numeros[100];

    if(fp2 == NULL){
        printf("não foi possivel abrir o arquivo\n");
        getchar();
        return 0;
    }

    while (fgets(numeros, 100, fp2) != NULL){
        scanf("%s", &numeros);
    }

    int n = 20, i;
    int Vetor[20];

    numeros[100] = Vetor[20]; //não sei como fazer para passar de string para int, já tentei usar atoi só que da errado

    selecao (Vetor, n);

    for (i = 0; i < n; i++){
        printf("%d - ", Vetor);
    }    

    //A quantidade de passos feitos é importante para verificar qual é o mais rapido
    printf("Feito em %d passos", passos);

    printf("\n");

    fclose(fp2);

    return 0;
}
 

Link para o comentário
Compartilhar em outros sites

  • 0
    //criando um arquivo e receber os numeros desejados
    printf("Quantas linhas possuira o arquivo?");
    scanf("%d", &t); 

Vou fazer uma pergunta....

você realmente gosta da programação e quer aprender realmente a ser um bom programador? Não faz falta me responder, responda para voz. Se a resposta for sim não faça isso nunca mais:
scanf("%d", &t);
int matriz[t][2];

Isso não faz parte do padrão de C, não sei da onde você tirou isso mas seja da onde for corte pelo sano, antes de adquirir más costumes. Para reservar um vetor ou uma matriz dinamicamente você DEVE usar malloc, é um conselho. Agora depende de vc, agora você tem 2 opções, a primeira é continuar fazendo isso "int matriz[t][2];", e a segunda é usar malloc que sim faz parte do C padrão que garante seu programa funcionar em qualquer maquina, da sua forma pode que funcione porem é uma "gambiarra". >_<

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

int passos = ;

//Funcao selection sort para organizar os numeros do arquivo
void selecao ( int Vet[], int n ) {

    int Menor, aux;
    int i, j;
    
    for ( i = ; i < n; i++ ) {
        Menor = i;
        
        for ( j = i + 1; j < n; j++ ) {
            if ( Vet[Menor] > Vet[j] )
                Menor = j;
                
            passos++;
        }
        
        if ( i != Menor ) {
            aux = Vet;
            Vet = Vet[Menor];
            Vet[Menor] = aux;
            passos++;
        }
    }
}

int main() {

    int l, k, i, t;
    
    //criando um arquivo e receber os numeros desejados
    printf ( "Quantas linhas possuira o arquivo?" );
    scanf ( "%d", &t );
    
    FILE *fp1 = fopen ( "ProjetoComp.txt", "w" );
    
    if ( fp1 == NULL ) {
        printf ( "não foi possivel abrir o arquivo\n" );
        getchar();
        return ;
    }
    
    //int matriz[t][2];
    int **matriz = (int**)malloc( sizeof(int**) * t );
    for(i=; i<t; i++ )
        matriz[i]=(int*)malloc(sizeof(int*)*2);
    
    for ( k = ; k < t;  k++ ) {
        printf ( "Informe os elementos da %da. linha:\n", ( k + 1 ) );
        
        for ( l = ; l < 2; l++ ) {
            scanf ( "%d", &matriz[k][l] );
            fprintf ( fp1, "%d\t", matriz[k][l]  );
        }
        fprintf ( fp1, "\n");
        printf ( "\n" );
    }
    
    fclose ( fp1 );
    
    //abrindo o arquivo criado para ler e realizar a ordenacao
    FILE *fp2 = fopen("ProjetoComp.txt","r");
    
    if(fp2 == NULL){
        printf("não foi possivel abrir o arquivo\n");
        getchar();
        return ;
    }

    k=;
    while ( fscanf(fp2, "%d %d%*c", &matriz[k][], &matriz[k][1] ) != EOF ){
        printf("linha %d %d %d\n", k, matriz[k][], matriz[k][1]);
        k++;
    }

    int *vetor = (int*)malloc( (sizeof(int*) * t) * 2 );
    printf("\n\nTam of vetor: %d\n\n", ((sizeof(int*) * t) * 2));
    
    k=;
    for(l=; l<t; l++){
        for( k=k, i= ; i<2; k++, i++ ){
            vetor[k] = matriz[l][i];
            printf("%d, ", vetor[k]);
        }
    }
    
    printf("Sorting!\n");
    //selecao( vetor, t*2 );  // Aqui você precisa chamar a função, mas a função não esta funcionando, só falta arrumar a função que organiza.
    
    for (i=; i<t*2 ; i++ ) {
        printf("%d, ", vetor[i]);
    }


    
    
    fclose(fp2);
    
    for(i=; i<t; i++ )
        free(matriz[i]);
    
    free(matriz);
    free(vetor);
    return ;
}

Seguindo mais ou menos a sua lógica eu joguei as variaveis no arquivo, depois eu fiz a leitura delas em uma matrz e depois eu passei a matriz para um vetor. Só falta arrumar a função que organiza a parada e tudo certo. Tente arrumar ela.

sorte

Link para o comentário
Compartilhar em outros sites

  • 0

Claro que gosto de programacao e quero ser um bom programador, é que eu ainda não conhecia o comando malloc, que por sinal você tinha razao e ajudou mt. O programa que eu quero esta pronto praticamente, só que tem um problema, ele roda perfeitamente, mas no final aparece aquela mensagem PROJETOCOMP.exe parou de funcionar etc. O que eu não entendo é q só aparece as vezes, não sei o que pode ser.

OBS: Quando só tinha uma funcao no codigo não aparecia, lembrando que uso o Code::Blocks,

	#include <stdio.h>
#include <stdlib.h>
#include <string.h>
	void selectionsort(int vetor[], int n){
	    int Menor, aux;
    int a, b, c;
	    for ( a = 0; a < n; a++ ) {
        Menor = a;
	        for ( b = a + 1; b < n; b++ ) {
            if ( vetor[Menor] > vetor[b] )
                Menor = b;
        }
	        if ( a != Menor ) {
            aux = vetor[a];
            vetor[a] = vetor[Menor];
            vetor[Menor] = aux;
        }
    }
}
	void bubblesort (int vetor[], int n){
	    int i,j, k = n, aux;
	    for(i = 0; i<n; i++){
        for (j = 0; j<k; j++){
            if(vetor[j]>vetor[j+1]){
                aux = vetor[j];
                vetor[j] = vetor[j+1];
                vetor[j+1] = aux;
            }
        }
        k--;
    }
}
	int main() {
	    int l, k, i, t;
	    printf ( "Quantas linhas possuira o arquivo? " );
    scanf ( "%d", &t );
	    FILE *fp1 = fopen ( "ProjetoComp.txt", "w" );
	    if ( fp1 == NULL ) {
        printf ( "não foi possivel abrir o arquivo\n" );
        getchar();
        return 0;
    }
	    int **matriz = (int**)malloc( sizeof(int**) * t );
    for(i=0; i<t; i++ )
        matriz[i]=(int*)malloc(sizeof(int*)*2);
	    for ( k = 0 ; k < t;  k++ ) {
        printf ( "Informe os elementos da %da. linha:\n", ( k + 1 ) );
	        for ( l = 0; l < 2; l++ ) {
            scanf ( "%d", &matriz[k][l] );
            fprintf ( fp1, "%d\t", matriz[k][l]  );
        }
        fprintf ( fp1, "\n");
        printf ( "\n" );
    }
	    fclose ( fp1 );
	    FILE *fp2 = fopen("ProjetoComp.txt","r");
	    if(fp2 == NULL){
        printf("não foi possivel abrir o arquivo\n");
        getchar();
        return ;
    }
	    k=0;
    while ( fscanf(fp2, "%d %d%*c", &matriz[k][0], &matriz[k][1] ) != EOF ){
        printf("linha %d - %d %d\n", k + 1, matriz[k][0], matriz[k][1]);
        k++;
    }
	    printf("\n");
	    int *vetor = (int*)malloc( (sizeof(int*) * t) * 2 );
	    k=0;
    for(l=0; l<t; l++){
        for( k=k, i=0 ; i<2; k++, i++ ){
            vetor[k] = matriz[l][i];
            printf("%d, ", vetor[k]);
        }
    }
	    printf("\n\n");
    printf("Selection Sort!\n");
	    selectionsort(vetor, t*2);
	    for (i=0; i<t*2 ; i++ ) {
        printf("%d, ", vetor[i]);
    }
	
    printf("\n\n");
    printf("Bubble Sort!\n");
	    bubblesort (vetor, t*2);
	    for (i=0; i<t*2 ; i++ ) {
        printf("%d, ", vetor[i+1]);
    }
	    fclose(fp2);
	    for(i=0; i<t; i++ )
        free(matriz[i]);
	    free(matriz);
    free(vetor);
    return 0;
	}

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...