Ir ao conteúdo
  • Cadastre-se
Gnomo Psicodélico

C Ler um arquivo e salvar de baixo pra cima

Recommended Posts

 Qual função eu uso para ler e salvar um arquivo de baixo pra cima.
Exemplo:
 

ARQUIVO A (vou ler desse arquivo e jogar para arquivo B)
ITEM 1
ITEM 2
ITEM 3

ARQUIVO B (recebe o que foi lido)
ITEM 3
ITEM 2
ITEM 1

 Tentei usar fseek para começar lendo de baixo mas não deu certo
PS: Não faço curso e nem fico assistindo tutoriais (estudo a função desejada e aprendo na pratica), programo apenas como hobby.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Gnomo Psicodélico    se for um arquivo txt você pode pegar palavra por palavra e colocar em um vetor ou struct e vai somando um contador para saber onde é o final e então usando um loop pegue essas palavras no vetor começando do fim para o começo e coloque no outro arquivo .

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Qual a estrutura do arquivo, tipos e como estão organizados

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você pode usar a classe deque + classe string e usar a função push_front da classe deque.

#include <iostream>
#include <string>
#include <fstream>
#include <deque>

int main()
{
    std::ifstream file;
    file.open("meuarquivo.txt");

    if (!file.is_open())
    {
        std::cout << "[ERRO] Falha ao abrir o arquivo: meuarquivo.txt." << std::endl;    
        std::cin.clear();
        std::cin.get();
        
        return 0;
    }
  
    std::string txt;
    std::deque<std::string> strings;

    while (!file.eof())
    {
        std::getline(file, txt);
        strings.push_front(txt);
    }

    for (std::deque<std::string>::iterator it = strings.begin(); it != strings.end(); ++it)
	std::cout << *it << std::endl;

    file.close();

    std::cin.clear();
    std::cin.get();

    return 0;
}

 

Arquivo meuarquivo.txt:

yoG94TY.png

 

Resultado(no caso usei o console como saida em vez de um arquivo por preguiça mesmo):

x7teWal.png

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

@devair1010  Cara não sei se ta certo mas fiz +- assim pra começar, só que ele ta duplicando

 

#include <iostream>
#include <windows.h>
#include <stdio.h>

main()
{
	FILE *teste;
	teste = fopen("teste2.txt","w+");
	char armazena[10];
	int contador = 0;
	printf("digite um nome: ");
	scanf("%s",&armazena[0]);
	++contador;
	
	printf("digite outro nome: ");
	scanf("%s",&armazena[1]);
	++contador;
	
	printf("digite mais um nome: ");
	scanf("%s",&armazena[2]);
	++contador;
	
	fprintf(teste,&armazena[0]);
	fprintf(teste,"\n");
	fprintf(teste,&armazena[1]);
	fprintf(teste,"\n");
	fprintf(teste,&armazena[2]);
	
	printf("%s",&armazena[0]);
	printf("\n");
	printf("%s",&armazena[1]);
	printf("\n");
	printf("%s",&armazena[2]);
	fclose(teste);
}


 Exemplo do erro:
Nome 1: a
Nome 2: b
Nome 3: c
 Ta salvando como:
Nome 1: abc
Nome 2: bc

Nome 3: c

 Porque desse erro? e a forma como estou fazendo está correta?
 

adicionado 1 minuto depois

@cyer  Isso ai não seria C++? gostaria que fosse em C, mas obrigado :)

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
25 minutos atrás, Gnomo Psicodélico disse:

@devair1010  Cara não sei se ta certo mas fiz +- assim pra começar, só que ele ta duplicando

 


#include <iostream>
#include <windows.h>
#include <stdio.h>

main()
{
	FILE *teste;
	teste = fopen("teste2.txt","w+");
	char armazena[10];
	int contador = 0;
	printf("digite um nome: ");
	scanf("%s",&armazena[0]);
	++contador;
	
	printf("digite outro nome: ");
	scanf("%s",&armazena[1]);
	++contador;
	
	printf("digite mais um nome: ");
	scanf("%s",&armazena[2]);
	++contador;
	
	fprintf(teste,&armazena[0]);
	fprintf(teste,"\n");
	fprintf(teste,&armazena[1]);
	fprintf(teste,"\n");
	fprintf(teste,&armazena[2]);
	
	printf("%s",&armazena[0]);
	printf("\n");
	printf("%s",&armazena[1]);
	printf("\n");
	printf("%s",&armazena[2]);
	fclose(teste);
}


 Exemplo do erro:
Nome 1: a
Nome 2: b
Nome 3: c
 Ta salvando como:
Nome 1: abc
Nome 2: bc

Nome 3: c

 Porque desse erro? e a forma como estou fazendo está correta?
 

adicionado 1 minuto depois

@cyer  Isso ai não seria C++? gostaria que fosse em C, mas obrigado :)

Desculpe, não tinha visto a tag do tópico então achei que era em C++

 

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

#define MAX_LINHAS                                600
#define MAX_CARACTERESPORLINHA                    1000

int main()
{
    FILE* arquivo = NULL;
        
    fopen("meuarquivo.txt", "r");

    if (arquivo == NULL)
    {
        printf("[ERRO] Falha ao abrir o arquivo: meuarquivo.txt!\n");
        system("pause");
        return 0;
    }

    char linhas[MAX_LINHAS][MAX_CARACTERESPORLINHA];
    size_t numLinhas = 0;

    while (fgets(linhas[numLinhas++], MAX_CARACTERESPORLINHA, arquivo) != NULL);

    for (size_t i = numLinhas - 1; i--;)
    {
        if (linhas[i])
        {
            printf("%s", linhas[i]);
            
            if (i == numLinhas - 2)
                printf("\n");
        }
    }

    fclose(arquivo);
    system("pause");
    return 0;
}

 

Resultado:

nmXJkac.png

  • Curtir 1
  • Amei 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@cyer  Não sabia que podia usar o for dessa forma, obrigado!
 É um código simples,fácil de entender e muito útil, funcionou perfeitamente. 
 Obrigado :thumbsup:

 

#include <iostream>
#include <windows.h>
#include <stdio.h>

char linhas[100][10];
main()
{
	int contador = 0;
	FILE *teste;
	teste = fopen("teste2.txt","r");
	while (fgets(linhas[contador++], 10, teste));
	   for (int i = contador - 1; i--;)
    {
        if (linhas[i])
        {
            printf("%s", linhas[i]);
            
            if (i == contador -2)
                printf("\n");
        }
    }
    fclose (teste);
}

 Poderia me explicar duas coisas? 
 

for (int i = contador - 1; i--;)    Porque nessa parte você coloca -1 na frente do contador? 
if (i == contador -2)               E aqui a mesma coisa, porque o -2?

 Tirando essas partes o resto eu compreendi perfeitamente como funciona

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
49 minutos atrás, Gnomo Psicodélico disse:

@cyer  Não sabia que podia usar o for dessa forma, obrigado!
 É um código simples,fácil de entender e muito útil, funcionou perfeitamente. 
 Obrigado :thumbsup:

 


#include <iostream>
#include <windows.h>
#include <stdio.h>

char linhas[100][10];
main()
{
	int contador = 0;
	FILE *teste;
	teste = fopen("teste2.txt","r");
	while (fgets(linhas[contador++], 10, teste));
	   for (int i = contador - 1; i--;)
    {
        if (linhas[i])
        {
            printf("%s", linhas[i]);
            
            if (i == contador -2)
                printf("\n");
        }
    }
    fclose (teste);
}

 Poderia me explicar duas coisas? 
 


for (int i = contador - 1; i--;)    Porque nessa parte você coloca -1 na frente do contador? 
if (i == contador -2)               E aqui a mesma coisa, porque o -2?

 Tirando essas partes o resto eu compreendi perfeitamente como funciona

 

 

Sabe quando você usa o for da forma?

for (int i = 0; i < 10; i++)

 

Então, nessa forma ai seria equivalente a isso:

for (int i = 10 - 1; i--;)

 

No caso vai começar do 9 e ir até o 0, assim como na forma de cima só que ao contrario: começar do 0 e terminar no 9

 

Eu coloquei o - 1, apenas para não começar em uma linha inválida pelo fato de começar do 0(lembra do 0 a 9?, então, seria 10 números, mas começando do 0 e terminando no 9)

 

Na parte do if (i == contador - 2), eu tive que fazer essa verificação apenas para poder corrigir a saída da ultima linha, visto que a sem por o \n na ultima linha, ficava dessa forma:

YVRU0IH.png

 

Como pode ver os ... ficaram tudo na mesma linha porque na ultima linha do arquivo não contem o \n, então esse if (i == contador - 2) seria apenas para verificar se está na ultima linha, se tiver adiciona o \n para arrumar esse problema.

  • Amei 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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 publicações 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

×