Ir ao conteúdo
  • Cadastre-se

C Ler um arquivo e salvar de baixo pra cima


Posts recomendados

 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
Link para o comentário
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
Link para o comentário
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
Link para o comentário
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
Link para o comentário
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
Link para o comentário
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
Link para o comentário
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
Link para o comentário
Compartilhar em outros sites

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...