Guest Danilo Postado Novembro 6, 2006 Denunciar Share Postado Novembro 6, 2006 Tenho um arquivo no seguinte formato:Teste1 3Teste2 1Teste3 2Separando a 1º coluna da 2º, há um <TAB>, ou seja, a linha esta assim: "Teste1\t3\n\0"Gostaria de ordenar esse arquivo, para deixar dessa forma:Teste1 3Teste3 2Teste2 1já criei alguns algoritmos proprios mas nenhum deu certo... Como eu poderia ordenar esse arquivo?Obrigado Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Guest Danilo Postado Novembro 6, 2006 Denunciar Share Postado Novembro 6, 2006 Esse é o meu algoritmo que fiz ate agora....short sOrdena(char *szNomeArq){ FILE *fpArqSaida, *fpArqOrd; int iQtdLinha = 0, iValor1 = 0, iValor2 = 0, iTamLinha = 0, iCont = 0, iCont2 = 0, iCont3 = 0, iCont4 = 0, iParam = 0; char szLinha1[TAMPALAVRA] = {0}, szLinha2[TAMPALAVRA] = {0}, szValor1[TAMPALAVRA] = {0}, szValor2[TAMPALAVRA] = {0}; iQtdLinha = (sVerificaQtdLinha(szNomeArq) - 1); iParam = strcmp("desc", szParam); fpArqSaida = fopen(szNomeArq, "r+"); for (iCont = 0; iCont <= iQtdLinha; iCont++) { fgets(szLinha1, TAMPALAVRA, fpArqSaida); iTamLinha = strlen(szLinha1); for (iCont2 = 0; iCont2 <= iTamLinha; iCont2++) { if (szLinha1[iCont2] == '\t') { int iPos = 0; iCont2++; while (szLinha1[iCont2] != '\n') { szValor1[iPos] = szLinha1[iCont2]; iCont2++; iPos++; } iValor1 = atoi(szValor1); } } fpArqOrd = fopen(szNomeArq, "r+"); while (!feof(fpArqOrd)) { fgets(szLinha2, TAMPALAVRA, fpArqOrd); iTamLinha = strlen(szLinha2); for (iCont3 = 0; iCont3<= iTamLinha; iCont3++) { if (szLinha2[iCont3] == '\t') { int iPos = 0; iCont3++; while (szLinha2[iCont3] != '\n') { szValor2[iPos] = szLinha2[iCont3]; iCont3++; iPos++; } iValor2 = atoi(szValor2); } } if (iValor1 < iValor2) { fseek(fpArqOrd, -35, SEEK_CUR); fprintf(fpArqOrd, "%s", szLinha2); fprintf(fpArqOrd, "%s", szLinha1); fseek(fpArqOrd, -35, SEEK_CUR); } } fclose(fpArqOrd); } fclose(fpArqSaida);}szNomeArq é o nome do arquivo a ser ordenado.Acho que minha logica está errada, pois ele fica num loop infinito.... acho que deve ser alguma coisa com o fseek, mas não sei o que é.... Se alguém puder dar alguma ajuda... Valeu!!! Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 iSoron Postado Novembro 6, 2006 Denunciar Share Postado Novembro 6, 2006 Não sei se entendi bem o problema.Fiz aqui um que ordena pela segunda coluna. :)#include <stdio.h> #define MAX_TAM_LINHA 300 #define MAX_NUM_LINHAS 20 #define swap(x,y) x^=(y^=(x^=y)) int main(int argc, char ** argv) { int i, j, n_linhas = 0; char linha_atual[MAX_TAM_LINHA]; char *linhas[MAX_NUM_LINHAS]; FILE *arquivo = fopen("entrada.txt", "r"); if(!arquivo) return 1; // Le as linhas e coloca num vetor while(fgets(linha_atual, MAX_TAM_LINHA, arquivo)) { linhas[n_linhas] = (char*) malloc(strlen(linha_atual) * sizeof(char)); strcpy(linhas[n_linhas], linha_atual); linhas[n_linhas][strlen(linha_atual) - 1] = '\0'; n_linhas++; } // Le os numeros da segunda coluna e guarda em outro vetor char tmp[200]; int numeros[n_linhas], original[n_linhas]; for(i = 0; i < n_linhas; i++) { sscanf(linhas[i], "%s %d", tmp, &numeros[i]); original[i] = i; } // Ordena de maneira muito ineficiente.. for(i = 0; i < n_linhas - 1; i++) { for(j = i+1; j < n_linhas; j++) { if(numeros[i] < numeros[j]) { swap(numeros[i], numeros[j]); swap(original[i], original[j]); } } } // Exibe as linhas na ordem correta for(i = 0; i < n_linhas; i++) { printf("%s\n", linhas[original[i]]); } return 0; } Só uma observação: C/C++ são péssimas linguagens para se fazer coisas simples como estas. Você precisa cuidar da alocação da memória, dos bytes, dos ponteiros, etc. Algumas linguagens script conseguem fazer o serviço de uma forma bem mais limpa. Veja como seria o mesmo programa em Python: n_linhas = 0 arquivo = open('entrada.txt', 'r') # Le as linhas e coloca num vetor linhas = [] for linha_atual in arquivo: linhas.append(linha_atual) n_linhas = n_linhas + 1 # Le os numeros da segunda coluna e guarda em outro vetor numeros = [] for linha_atual in linhas: palavras = linha_atual.split("\t") numeros.append(int(palavras[1])) numeros = zip(numeros, range(0, len(numeros))) # Ordena de forma eficiente numeros.sort() numeros.reverse() # Exibe as linhas na ordem correta for n in numeros: print linhas[n[1]], Té mais. Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Guest Danilo
Tenho um arquivo no seguinte formato:
Teste1 3
Teste2 1
Teste3 2
Separando a 1º coluna da 2º, há um <TAB>, ou seja, a linha esta assim: "Teste1\t3\n\0"
Gostaria de ordenar esse arquivo, para deixar dessa forma:
Teste1 3
Teste3 2
Teste2 1
já criei alguns algoritmos proprios mas nenhum deu certo... Como eu poderia ordenar esse arquivo?
Obrigado
Link para o comentário
Compartilhar em outros sites
2 respostass a esta questão
Posts Recomendados
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.