Jump to content
Dexter's Lab

Files

Recommended Posts

Dexter's Lab

Boas, estou com um problema em ficheiros. Estou a ter alguma dificuldade nesta matéria e por isso queria pedir a vossa ajuda, começando com o seguinte:

Porque é que o documento não está a copiar para o outro?

#include<stdio.h>

/*
Copiar conteúdo de um ficheiro para o outro.
*/

void copy();
void output();

int main(void)
{
   copy();
   output();

   return 0;
}

void copy()
{
   FILE *source = fopen("ex2.txt", "r");
   FILE *file = fopen("ex3.txt", "w");
   char letter;

   if(!file || !source)
   {
    printf("Impossível criar ficheiro.");
    return;
   }

   do
   {
    letter = fgetc(source);
    fputc(letter, file);
   } while (letter != EOF);

   fclose(source);
   fclose(file);
}

void output()
{
   FILE *source = fopen("ex2.txt", "r");
   FILE *file = fopen("ex3.txt", "w");
   char str[200], nstr[200];

   if(!file || !source)
   {
    puts("Ficheiro não encontrado.");
    return;
   }

   puts("Original:");
   fgets(str, 200, source);
   printf("%s", str);

   puts("Cópia:");
   fgets(nstr, 200, file);
   printf("%s", nstr);

   fclose(source);
   fclose(file);
}

Share this post


Link to post
Share on other sites
HappyHippyHippo

Porque é que o documento não está a copiar para o outro?

o ficheiro "ex2.txt" está a ser copiado para o ficheiro "ex3.txt" correctamente,

o problema é que estás a estragar tudo depois.

void output()
{
   FILE *source = fopen("ex2.txt", "r");
   FILE *file = fopen("ex3.txt", "w");


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Dexter's Lab

Ah, de facto isso estava mal.. coloquei ambos em "r" e resultou. Bastou esse pormenor. Muito obrigado, HHHippo. É possível que tenha mais dúvidas, se for possível responder eu ficaria muito grato. Colocá-las-ei no tópico assim que surjam.

Share this post


Link to post
Share on other sites
Dexter's Lab

Bem, agora estou preso num problema que não me parece ter sentido.

Estou a usar a seguinte função de append (embora ainda só copie) e o ficheiro de cópia não é aberto pelo meu linux. Aparece que o gedit não conseguiu abrir:

"gedit has not been able to detect the character encoding.

Please check that you are not trying to open a binary file.

Select a character encoding from the menu and try again."

Não entendo porque isto aparece.

O código é este:

#include<stdio.h>

/*

*/

void append();
void output();

int main(void)
{
   append();
   output();

   return 0;
}

void append()
{
   FILE *source = fopen("ex5.txt", "r");
   FILE *file = fopen("ex6.txt", "w");
   char letter;

   if(!file || !source)
   {
    printf("Impossível criar ficheiro.");
    return;
   }

   do
   {
    letter = fgetc(source);
    fputc(letter, file);
   } while (letter != EOF);

   fclose(source);
   fclose(file);
}

void output()
{

}

Edited by Dexter's Lab

Share this post


Link to post
Share on other sites
Dexter's Lab

A função é igual a uma que usei anteriormente e que o gedit leu corretamente. Portanto não entendo o que está a acontecer agora.

Share this post


Link to post
Share on other sites
Dexter's Lab

"ola o meu nome é teste"

o "ola" tinha vindo do ex4 e no ex5 fiz um append manual de "o meu nome é teste"

Esse append está no seguinte código:

#include<stdio.h>
#include<string.h>
/*
Concatenar dois ficheiros de texto (forma um).
1 - abre os ficheiros
2 - preenche o segundo com o conteudo da fonte
3 - anexa mais conteudo ao segundo ficheiro
*/

void append();
void output();

int main(void)
{
   append();
   output();

   return 0;
}


void append()
{
   FILE *source = fopen("ex4.txt", "r");
   FILE *file = fopen("ex5.txt", "w");
   char str[200], letter;

   if(!file || !source)
   {
    printf("Ficheiros não encontrados.");
    return;
   }

   fgets(str, 200, source);
   str[strlen(str)-1] = ' ';
   fputs(str, file);

   do
   {
    letter = fgetc(source);
    printf("%c", letter);
   } while(letter != EOF);

   printf("O que deseja acrescentar ao ficheiro?\n\nEscreva:\n");
   while((letter = getchar()) != '\n')
   {
    fputc(letter, file);
   }

   fclose(source);
   fclose(file);
}

void output()
{
   FILE *file = fopen("ex5.txt", "r");
   char car;

   if(!file)
   {
    printf("Ficheiro não encontrado");
    return;
   }

   do
   {
    car = fgetc(file);
    printf("%c", car);
   }while(car != EOF);

   fclose(file);
}

Share this post


Link to post
Share on other sites
HappyHippyHippo

se o ficheiro "ex4.txt" só tem "ola" o problema está aqui:

   fgets(str, 200, source);

   // dados do array src
   // src[0] = 'o'
   // src[1] = 'l'
   // src[2] = 'a'
   // src[3] = '\0'
   // src[4] = -- lixo --
   // src[5] = -- lixo --
   // src[6] = -- lixo --
   // src[7] = -- lixo --

   str[strlen(str)-1] = ' ';

   // dados do array src
   // src[0] = 'o'
   // src[1] = 'l'
   // src[2] = 'a'
   // src[3] = ' '
   // src[4] = -- lixo --
   // src[5] = -- lixo --
   // src[6] = -- lixo --
   // src[7] = -- lixo --

   fputs(str, file);

   // o que acabaste de escrever no ficheiro é "ola " com uma carrada de lixo até a sorte fazer aparecer o valor 0 ('\0')


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Dexter's Lab

Mas HHHippo, quando ele depois faz o append, ele preenche o espaço que segue o ' ' com a nova string e termina essa nova com '\0', não é? Ou seja, para todos os efeitos a string total só termina no '\0'.

Eu consigo abrir o ficheiro ex.5, so não consigo o ex.6.

Mesmo que retire a instrução do strlen() ele não abre o ficheiro.

Share this post


Link to post
Share on other sites
HappyHippyHippo

Mas HHHippo, quando ele depois faz o append, ele preenche o espaço que segue o ' ' com a nova string e termina essa nova com '\0', não é?

não

estas a escrever imediatamente no ficheiro, lê o teu próprio código.


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Dexter's Lab

Estou a perceber. Eu não entendo muito de ficheiros ainda, como posso resolver essa questão? Neste momento, o meu código ex5 está assim:

void append()
{
   FILE *source = fopen("ex4.txt", "r");
   FILE *file = fopen("ex5.txt", "w");
   char str[200], letter;

   if(!file || !source)
   {
    printf("Ficheiros não encontrados.");
    return;
   }

   fgets(str, 200, source);
   str[strlen(str)-1] = ' ';
   fputs(str, file);

   do
   {
    letter = fgetc(source);
    printf("%c", letter);
   } while(letter != EOF);

   printf("O que deseja acrescentar ao ficheiro?\n\nEscreva:\n");
   fgets(str, 200, stdin);
   fputs(str, file);

   fclose(source);
   fclose(file);
}

Se eu no ex6 lhe der condição de paragem um \n o ficheiro abre e mostra. Mas não quero isso, pois não era suposto. Quero abri-lo usando o EOF. Como posso fazê-lo? Estou um pouco às cegas neste contexto e vou ter exame na sexta feira. Agradeço desde já

Share this post


Link to post
Share on other sites
HappyHippyHippo
void append()
{
   FILE *source = fopen("ex4.txt", "r");
   FILE *file = fopen("ex5.txt", "w");
   char str[200];
   int source_size = 0;

   if(!file || !source)
   {
           printf("Ficheiros não encontrados.");
           return;
   }

   fgets(str, 200, source);
   source_size = strlen(str);
/*
   str[strlen(str)-1] = ' ';
   fputs(str, file);

   do
   {
           letter = fgetc(source);
           printf("%c", letter);
   } while(letter != EOF);
*/
   printf("O que deseja acrescentar ao ficheiro?\n\nEscreva:\n");
   fgets(&str[source_size], 200 - source_size, stdin);
   fputs(str, file);

   fclose(source);
   fclose(file);
}


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Dexter's Lab

Não funciona mesmo assim.

Vi o ls -la no terminal. O numero de bytes é o devido +1, ou seja, tem mais um byte que deveria.

Abri o ficheiro com o vim e realmente tem lá um char que está a mais "ỹ", que é unicode.. agora, como ele está a introduzir-se ali no ficheiro e porquê é que não entendo.. ele aparece no final do ficheiro logo após um \n que é o "penúltimo" caractere antes do EOF

Share this post


Link to post
Share on other sites
HappyHippyHippo

deverá ser porcarias que tens na leitura de dados do teclado antes da chamada desta função


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Dexter's Lab

HHHippo, estive a ler o código passo a passo e o que se passa é na cópia char a char.

Sendo um do...while, ele ainda coloca um caractere extra antes de sair do ciclo.

do
{
 letter = fgetc(source);	   //coloca na variável de transferencia
 fputc(letter, file);			   //coloca da variável no ficheiro
} while(letter != EOF);		   //só agora é que verifica o caractere que entretanto já lá colocou

Poderá ser isto? Vou fazer um if para verificar.

Reparei que por vezes o terminal do linux dá um caracter "?" no início ou fim, quando apresento os documentos no terminal no decorrer do programa.

Share this post


Link to post
Share on other sites
HappyHippyHippo

engraçado, porque parece que eu comentei esse código e no entanto estás a dizer que o tens a correr ...


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Dexter's Lab

Já resolvi o meu problema. Tive que usar um loop infinito, que odeio usar, e dar-lhe uma condição de paragem se o caractere fosse o EOF.

	do
{
	letter = fgetc(source);

	if(letter == EOF)
		break;
	else
		fputc(letter, file);

} while (1);

HHHippo, eu não fiz copy paste, transcrevi as alterações que fizeste manualmente. Assim ajudar-me-ia a compreender o que foi feito. Agradeço muito e a tua ajuda foi essencial para perceber onde estava o erro.

Edited by Dexter's Lab

Share this post


Link to post
Share on other sites
Dexter's Lab

Boas, no seguinte programa:

int main(void) {

   FILE *file = fopen("ex8exp.txt", "r");

   if(!file) {
    printf("Não foi possível criar ficheiro.");
    return;
    }

   int round, ssize, len;

   fscanf(file, "%d", &len);
   char str[len][0], temp[100];

   for(round = 0; round < len; round++) {
    fscanf(file, "%d", &ssize);

    fgets(temp, ssize+1, file);
    strncpy(str[round], temp, ssize);
    printf("%s\n", str[round]);
   }
}

Em que ele abre o ficheiro que possui um primeiro número que indica quantos nomes serão, depois antes de cada nome indicará quantos caracteres terá o nome e ele lê n caracteres do nome que está à sua frente.

O ficheiro é o seguinte:

"3

5joana

4jose

9francisco"

Agora a questão é a seguinte, no output surge-me o seguinte:

"joana

jose

francisco

segmentation fault"

Percebo que foi acedido um espaço de memória que não deveria ter acedido, mas queria perceber o porquê. Já dei umas voltas ao código e não enocntro o motivo.

Agradeceria qualquer ajuda.

Share this post


Link to post
Share on other sites
Dexter's Lab

É um char, mas a variável é um array de arrays que possui 2 dimensões, a primeira éo numero de arrays, 2 é o tamanho de cada um dos arrays.

Não sei se era aqui que querias chegar.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.