Ir ao conteúdo
  • Cadastre-se

como escrever em um arquivo,um dado ao lado do outro


Liliane Barboza

Posts recomendados

neste código escreve-se um item abaixo do outro ,ok, agora como anexar mais conteudo ao arquivo de forma que fique ao lado do que já está lá e não abaixo.?
 
ex.1-101
     2-102
     3-103
 
 
 
#include <stdio.h>

int main ()
{

FILE *A;
int i;

A = fopen ("teste.txt", "w");

if (A == NULL)
{
printf ("Erro na abertura do arquivo!");
}
else
{
for (i=1;i<=100;i++)
{
fprintf (A, "%d\n", i);
}

fclose (A);
}
A = fopen ("teste.txt", "a");
if (A == NULL)
{
printf ("Erro na abertura do arquivo!");
}
else
{
for (i=1;i<=100;i++)
{
fprintf (A, "%d-", i+100);
}
fclose(A);
}

Link para o comentário
Compartilhar em outros sites

Posso lhe dizer que "não" é possível, porém explicar isso aqui vão ser mil linhas. vou lhe dizer que um arquivo salvado em um disco duro é algo físico é lineal, cada letra esta colocada em uma posição predeterminado por nós tudo de forma compacta, manipular esses dados somente é possível cargando todo o arquivo na memoria, editá-lo e novamente voltar a salvá-lo, isso é o que faz um editor de texto, a menos que você quiser fazer um, é bom entender certos conceitos.

Hora queimar os circuitos neuronais >_<. Vou te fazer uma perguntinha bem simples. você acha que uma matriz é bidimensional? :muro:

Si eu tiver int matriz[3][3]; e logo eu guardar nela algo assim:
123
456
789

você acha que eu preciso de um for double para imprimir por exemplo? Algo assim

#include <stdio.h>#include <stdlib.h>int main () {    int matriz[3][3] = {            {1,2,3},        {4,5,6},        {7,8,9}            };        int i, x;        for ( i = 0; i < 3; i++ ) {        for ( x = 0; x < 3; x++ ) {            printf ( "%d ", matriz[i][x] );        }    }    getchar();    return 0;}

Na verdade nada é o que parece, veja só isso e me diga se entende algo:

#include <stdio.h>#include <stdlib.h>int main () {    int matriz[3][3] = {            {1,2,3},        {4,5,6},        {7,8,9}            };        int i, x;        for ( i = 0; i < 3; i++ ) {        for ( x = 0; x < 3; x++ ) {            printf ( "%d ", matriz[i][x] );        }    }    printf("\n\n");    matriz[0][3]++; // nao existe a casinha matriz[0][3], a ultima casinha da primeira fila é matriz[0][3], mas vamos fazer uma prova         for ( i = 0; i < 3; i++ ) {        for ( x = 0; x < 3; x++ ) {            printf ( "%d ", matriz[i][x] );        }    }        getchar();    return 0;}

Vou lhe explicar.... Quando declaro a matriz na linha 5...

    int matriz[3][3] = {            {1,2,3},        {4,5,6},        {7,8,9}            };

você acha que ela esta dessa forma la na memoria:

123
456
789

 

 

...porém ela esta dessa forma: 123456789.

 

Quer a prova? Vamos lá. O tamanho da matriz é de 3*3, ou seja 9, se eu tratar ela como um vetor de 9 posiçoes, tipo matriz[0][0] seria a primeira posição, e matriz[0][8] seria a ultima, não sei se deu para entender. Vamos com um exemplo:

#include <stdio.h>#include <stdlib.h>int main () {    int matriz[3][3] = {            {1, 2, 3},        {4, 5, 6},        {7, 8, 9}            };        int i;        for ( i = 0; i < 3*3; i++ ) { // Com um só loop for imprimo toda a matriz.        printf ( "%d ", matriz[0][i] );    }            getchar();    return 0;}

Certamente a essa hora seus circuitos neuronais já estão derretendo. :lol: Eu troquei:

    for ( i = 0; i < 3; i++ ) {        for ( x = 0; x < 3; x++ ) {            printf ( "%d ", matriz[i][x] );        }    }   

por:

    for ( i = 0; i < 3*3; i++ ) {        printf ( "%d ", matriz[0][i] );    }

E funcionou!!! :eek:  :o  :muro:  :tantan:  :crazy:  :naonao:  A grande pergunta é... Por quê?
 

Si ficou na sua cabeça entrou que a memoria é física e lineal, nesse momento você deve saber que onde termina matriz[0][2], ou seja, a ultima casinha da primeira linha, logo depois começa matriz[1][0], ou seja a primeira casinha da segunda linha, toda ela esta uma casa depois da outra, a matriz completa. Vou colocar todas as casas de forma ordenada como elas aparecem na memoria:

matriz[0][0], matriz[0][1], matriz[0][2], matriz[1][0], matriz[1][1], matriz[1][2], matriz[2][0], matriz[2][1], matriz[2][2], cada casinha se encontra nessa ordem todas em linha, não existe nada tridimensional, nem bidimensional, simplesmente são formas de facilitar a organização dos dados para nós, não ha magia nenhuma, tudo é estão simples que da nojo. :priv:

 

Por isso no exemplo que eu fiz matriz[0][2]++;, equivale a matriz[1][0]++;, eu saí de rango a proposito na primeira linha e afetou a segunda linha que na memoria tava logo a continuação da primeira, pois C e C++ colocam todas as variáveis em linha na memoria RAM, Imaginou si essa variável fosse importante para algo como laçar um foguete XD, e pior ainda, eu errei más dentro da  minha matriz. Mas e si eu erro na ultima?

 

Por isso C/C++ permitem você sair de rango, para poder tratar grandes quantidades de dados de forma lineal, um exemplo são imagens, usar for duplo é mais lento que usar um só for, isso em java não acontece, o programa avisa lá bonitinho que você ta cometendo um erro... Mas si não for um erro como demostrei? Si eu quiser tratar uma matriz como um vetor porque sei que assim vai ser mais rápido? Isso não é um erro verdade?

Agora voltando ao assunto.... Que tem que ver tudo isso com sua duvida? Muito. no seu caso você acha que tem:

1
2
3

quando você tem no disco duro: 123. Ai você quer tipo pegar desde 1 e por -101, achando que o 2 e o 3 vão se mover. Deixa eu te dizer uma coisa, si isso fosse possível você estaria sobrescrevendo valores como no caso da matriz, você simplesmente pode adicionar no final, realmente ignoro o que acontece nesse caso, talvez todo o arquivo se translade a outra parte mais amplia na que caiba todas as mudanças, ou simplesmente a parte adicionada se escreve em outra parte e tudo funciona por ponteiros tipo "de aqui salte até a posição do disco X para continuar lendo", realmente nunca necessitei saber isso, é uma boa pergunta para buscar respostas, porém de pouca relevância para resolver seu problema. você não acha que que si fosse possível fazer o que você propõe não deveria existir alguma função que te permita você adicionar conteúdo em uma certa posição.

Deixa eu te explicar como funciona a leitura de arquivos. Para ler um arquivo você tem um ponteiro que é criado quando você faz FILE *p;. logo devemos especificar onde que remos começar com esse ponteiro, isso faz a função fopen, ela introduz nosso ponteiro em uma posiçao determinada do arquivo, si queremos no inicio do arquivo com os modos de abertura r/ w para ler/escrever desde o principio, no caso de escrever o arquivo se destrói se já existir anteriormente, por razoes obvias, vamos sobrescrever em cima dele deixando ele totalmente inutilizado, e no caso de adicionar com o modo a, no final do arquivo. Cada vez que fazemos uma leitura ou escritura o ponteiro avança, para fazer o que você quer consiste em fazer vários avances e retrocessos tipo pegando um dado e jogando ele para frente abrindo uma especie de buraco no qual você teria suficiente espaço para insertar sua nova variável, pense que si eu tenho "123" e quero por -101 logo depois do 1 eu tinha que ter vários passos como ampliar o espaço"123    ", copiar 2 e 3 no final "1    23", para logo introduzir -101 depois do 1 "1-10123". Entendeu o por que eu disse que "não" é possível entre aspas duplas logo no inicio? Por que acho muito mais trabalho do que você carregar tudo na memoria, editar e sobrescrever o arquivo.

 

Eu já não vou mais estender, acho que é enrolar e enrolar, certamente você quer uma solução. Uma solução seria você reservar espaço nesse arquivo logo depois do 1 tipo "1    \n2    \n3    \n", nesse caso você já teria os espaços reservados desde o inicio no arquivo, e logo é só preencher"1-101\n2-102\n3-103\n", mas terá que fazer uso de funções como fseek, rewind, ftell... não será fácil.

Espero que seja tudo de utilidade, não queria alargar muito mas o tema é bem longo. Si tiver duvida pergunte.

Meu conselho é Pegue tudo o que estiver nesse arquivo, carregue na memoria edite o conteúdo e logo volte a sobrescrever esse arquivo com o modo de abertura 'w'. ;)

Agora si o que você quer é praticar, te recomendo que busque informação sobre funções que comentei. Si quiser uma ajuda pode me adicionar la no skype para uma melhor ajuda.

Sorte.
 

 

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

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

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!