View Full Version : Escrever para ficheiro (ler tb) em C


Pontiac
22-01-2006, 16:36
Boas,
Alguem me pode dar umas luzes de como escrever um profile (tipo nome, nº, data, etc.) para um ficheiro e depois escrever outro por baixo?
Vou tentar explicar o melhor possivel. É que o problema não é escrever o 1º, é que depois ao escrever o 2º profile, isto escreve por cima do 1º.
Já li mt coisa acerca de escrever para ficheiros mas só o que arranjo é explicações um pouco básicas do tipo fazes fprintf etc etc..
ajudem pk estou complentamente sem ideias...

greven
22-01-2006, 17:07
Já há bastante tempo que não programo em C (isso vai mudar brevemente...) por isso não te posso dar a certeza absoluta.

Mas penso que isso te está a acontecer pois estás a abrir o ficheiro no modo r. Tenta abrir no modo a+ e o cursor de escrita está no fim do ficheiro e não no inicio como no modo r.

Vê se te ajuda.

Madril
22-01-2006, 17:08
Fazes fprintf e acabas a string com \n ... ele mete o file pointer pra linha seguinte.

Vi agora a resposta do greven ... tens k abrir como "w" ... e se tiveres que abrir o ficheiro pela segunda vez por exemplo, tens que percorrer até lá abaixo.

Vai ver os manuais da Gnu por exemplo ;)

Pontiac
22-01-2006, 17:19
É isso mesmo!! resultou na perfeição, obrigado.

Madril
22-01-2006, 17:21
Qual solução ?

A minha ou a do Merven ?

Pontiac
22-01-2006, 17:52
A do Greven, a tua é para muda de linha no ficheiro o que tambem a usei. :D
So uma coisa agora para ler do ficheiro se eu puser algo do genero: while(i!= "\n") manda para uma variavel etc.. ele reconhece o \n como sendo o fim de uma linha no ficheiro?

greven
22-01-2006, 18:15
Penso que sim... mas nada melhor que um debug! :D Experimenta e vê. Esses pequenos pormenores eu relembro trying! ;)

Madril, és um noob! :D

PrOdG
22-01-2006, 23:34
$ man fopen
FILE *fopen(const char *path, const char *mode);

r Open text file for reading. The stream is positioned at the
beginning of the file.

r+ Open for reading and writing. The stream is positioned at the
beginning of the file.

w Truncate file to zero length or create text file for writing.
The stream is positioned at the beginning of the file.

w+ Open for reading and writing. The file is created if it does
not exist, otherwise it is truncated. The stream is positioned
at the beginning of the file.

a Open for appending (writing at end of file). The file is cre-
ated if it does not exist. The stream is positioned at the end
of the file.

a+ Open for reading and appending (writing at end of file). The
file is created if it does not exist. The initial file position
for reading is at the beginning of the file, but output is
always appended to the end of the file.


Se quiseres ler linha a linha, tens sempre o fgets (lembra-te que o '\n' fica no fim da string que lês).

Galbne_PT
23-01-2006, 18:18
Já algum tempo k não programo em c, mas no tempo que k era obrigado em programar em c lembro-me k existe uma funcão mt boa para o deu caso, tens é de ver no google ou algo do genero como usa-la bem.... a funcao é a fseek, pelo k me lembro poe o offset na posicao do ficheiro onde kiseres...

Pontiac
23-01-2006, 18:48
Agora tenho outro problema :\
Quando faço fgets(..) isto lê bem a primeira linha mas não faço a minima ideia como o ponho a ler a 2ª linha e mandar essa 2ª para outra variavel...
Ja tentei dar a volta á questão usando fscanf mas ao ler um %s só lê a primeira palavra... Presumo que com %s não va a lado nenhum porque a linha tanto pode ter 1 com 2,3 palavras...
Alguem me pode ajudar a por isto a lêr linha a linha?

Madril
23-01-2006, 18:51
while(fgets pra um buffer)

HecKel
23-01-2006, 19:12
A solução do Madril para mim de facto é a melhor, mas cá vai uma curta explicação (se conseguir....)

A cada iteracção do while o "ponteiro" que "indica" a linha "desce", dentro do while basta fazeres fgets como se estivesses a ler apenas uma linha, o while trata de te "mover" o ponteiro para baixo...

btw, usa o !EOF(f) para evitares que estoire ;)

abraços, HecKel

Madril
23-01-2006, 19:16
EOF pra que ?

é só fazer man ao fgets ... alem disso o fgets se bem me lembro diz o numero de caracteres lidos, pelo que quando chega ao fim dá 0 :rolleyes:

Pontiac
23-01-2006, 19:50
Epah ja não tou a perceber nada,
Eu tenho isto:

FILE *produtores;

produtores = fopen ("produtores.txt","r");


while (>>n sei k condição meter<<) {

fgets(produtor.nome,80, produtores);

printf("%s \n", produtor.nome );

}

kualker coisa que meta dentro da condigão do while entra sempre em ciclo infinito, ja exprimentei
while (fgetc(produtores)!='\n')

para que quando axasse um \n parasse, mas continua sempre e na mesma linha .

Madril
23-01-2006, 19:51
Metes o fgets na condição do while

Pontiac
23-01-2006, 19:55
LOL e não é que da mesmo, não percebo é a lógica disso mas funciona :D

HecKel
23-01-2006, 20:40
ahhh, Madril tava a pensar noutra cena..., sorry :(

abraços, HecKel

HiGhVoIcE
25-01-2006, 22:50
podes por funções como condições em whiles, if, etc...por algum motivo as funções podem ter retorno de algo ;)

Umek
03-02-2006, 21:13
porque nao fazes assim?

while( caracter = fgetc( produtos ) )
if( caracter != '\n' )

Umek
03-02-2006, 21:16
olha eskece mete antes só: while( !EOF ).
deve chegar para sacares todas as strings uma de cada vez até ao fim do ficheiro.

jaac
04-02-2006, 16:08
#define SIZE 1024
FILE *file;
char line[SIZE];
file = fopen("file.txt","r");
while(fgets(line,SIZE,file) != NULL)
{
....
}
fclose(file);


O conteúdo de cada linha vai estar no line