Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
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 .

Editado por devair1010
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Editado por Mauro Britivaldo
  • 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

Editado por cyer
  • 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

Editado por cyer
  • 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.

Editado por cyer
  • 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






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

×