Jump to content
crazygod

[Ajuda] Ficheiros

Recommended Posts

crazygod

Ola a todos...

gostaria que quando alguém tivesse um tempito, me explicasse uma coisa se faz favor...

eu fiz um programito simples no (Ubuntu), deu luta ;) mas la consegui perceber como o meter a funcionar da maneira que eu queria....

bem o programa funciona que é uma maravilha (apesar que voçes podem achar que não esta lá muito bem)...

mas quando levei o meu codigo para o windows para o compilar com Dev-Cpp...ui ui...posso dizer que o programa fazia tudo menos o que era pedido...e eu agora pergunto...

mesmo eu nao tendo usado nada especifico do ubuntu que fosse incompativel com o windos, o programa nao me funciona direito

O Programa

(so depois de escrever isto tudo é que reparei que não expliquei o que o programa faz, mas passo a explicar)

o programa le um ficheiro de texto (.txt) e inverte todo o texto

(eu disse que era um programito :) )

aqui esta o codigo...

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#define MAXCHARS 150

char *inverter(char *s);


int main(int argc, char *argv[])
{

FILE *fp;
long Posicao=0L;
char s[MAXCHARS];

switch(argc)
{
	case 2:	if((fp=fopen(argv[1],"r+"))==NULL)
		{
			printf("Erro abrir Ficheiro\n");
			exit(1);
		}break;
	default: printf("SINTAXE:\n\n%s NOME_FICHIERO\n\n",argv[0]);
			exit(2);
};

while(fgets(s,MAXCHARS+1,fp)!=NULL)
{	
	//retiro o ultimo caracter ('\n')
	s[strlen(s)-1]='\0';
	//coloco o cursor no inicio da frase e depois movo para a posição da string+1(caracter '\n' que removi 
	fseek(fp,Posicao,SEEK_SET);	
	//escrevo a frase lida no texto		
	fprintf(fp,"%s\n",inverter(s));          //tive que criar esta função, pois estava a ter erro ao chamar o função [b] strrev()[/b]
	//avanço para mais uma linha
	Posicao+=strlen(s)+1;
}

printf("Fim do Programa...(TmRocha)\n");
fclose(fp);
return 0;



}

bem será que sou eu que nao tenho mesmo jeitinho nenhum para isto da programação!!!

ou é esta "luta" entre linux VS windos

que me esta a baralhar todo....

Desde já Obrigado

Share this post


Link to post
Share on other sites
Localhost

Como assim "não funciona direito em Windows"...? Dá algum erro?


here since 2009

Share this post


Link to post
Share on other sites
crazygod

eu tentei corrigir de varias maneiras....mas tipo, ou fica num ciclo infinito.....

por exemplo num ficheiro com o texto

"OLA"

ja me aconteceu ter milhoes e milhoes de espacos....de "Enters".....

o ficheiro chegou a ter quase 30Mb de tantos espacos e enters

sinceramente não sei o que podera ser.....

Share this post


Link to post
Share on other sites
bubulindo

Eu vejo isto

while(fgets(s,MAXCHARS+1,fp)!=NULL)

de errado. fgets() vai ler de fp, MAXCHARDS+1 para o vector s que tem MAXCHARS posicões. Então, nalguns casos vais fazer overflow do buffer. Não sei se é isto que causa o teu problema... mas que não parece correcto, não parece.

A definicão de fgets diz algo assim:

"Reads characters from stream and stores them as a C string into str until (num-1) characters have been read or either a newline or a the End-of-File is reached, whichever comes first.

A newline character makes fgets stop reading, but it is considered a valid character and therefore it is included in the string copied to str.

A null character is automatically appended in str after the characters read to signal the end of the C string."

Logo não precisas de fazer a aritmética para colocar o '\0'...

Era algo assim que procuravas?

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#define MAXCHARS 150

//char *inverter(char *s);


int main(int argc, char *argv[])
{

        FILE *fp;
        long Posicao, PrevPosicao;
        char s[MAXCHARS], i, newline;

        switch(argc)
        {
                case 2: if((fp=fopen(argv[1],"r+"))==NULL)
                        {
                                printf("Erro abrir Ficheiro\n");
                                exit(1);
                        }break;
                default: printf("SINTAXE:\n\n%s NOME_FICHIERO\n\n",argv[0]);
                                exit(2);
        };

	//posicão antes e depois de escrita. 
	PrevPosicao = ftell(fp);

        while(fgets(s,MAXCHARS,fp)!=NULL)
        {      
		Posicao = ftell(fp);//get position in the file after reading. 


		newline = 0;
		if (s[strlen(s)-1]=='\n') {//remove \n from string
				s[strlen(s)-1] = '\0'; 
			newline = 1;//if there's no \n, we shouldn' write it on the last line... otherwise we overflow the file
			}

		//go back to Previous position before reading
		fseek(fp, PrevPosicao, SEEK_SET); 
		fprintf(fp,"%s", strrev(s)); //write the reversed string
		if (newline) fputc('\n', fp);//if we had a newline originally, put it... if not... 

		PrevPosicao = ftell(fp);//to be used later

		fseek(fp,Posicao,SEEK_SET);//return to where we were after the read...     

        }       
        fclose(fp);
        return 0;
}


include <ai se te avio>

Mãe () {

}

Share this post


Link to post
Share on other sites
crazygod

sim era isso...

e quando eu colocava o '\0' era para remover o caracter '\n'

obrigado pela ajuda, mas ja agora será que me podes aconselhar algo para eu praticar..

(não me estou a ser explicar mas é assim)

eu dependendo do programa tenho dificuldades em passar a ideia para o papel (fazer o fluxograma), por isso sento-me em frente ao pc e toca a escrever....sei que isto esta errado,mas pronto...

e depois se calhar bubulindo se não te importares eu gostava de te pedir um pouco de ajuda ("orientares-me") sobre que "caminhos" seguir na programação...mas enquanto isso vou continuar a praticar...

Obrigado

Share this post


Link to post
Share on other sites
Localhost

Isso é normal. À medida que vais tendo mais experiência esse tipo de dificuldade vai sendo ultrapassado.

Não é necessário criares um fluxograma. Basta pores em papel qual é a ideia que tens para resolver determinado problema, escrever as ideias principais e ir avançando.


here since 2009

Share this post


Link to post
Share on other sites
bubulindo

Na programacão experiência é tudo... e só ganhas experiência praticando e "batendo com a cabeca nas paredes" até perceberes o que fizeste de errado.

Para comecares, fazer o fluxograma (na forma gráfica) pode ser um desperdício de tempo, se não estiveres habituado... Então comeca por imaginar-te a usar o programa... metes o nome na consola, os argumentos, carregas no enter. O programa então vai:

- avaliar os argumentos. Se forem bons, continua. Se não, termina e dá feedback ao utilizador.

- Ler uma linha ou o buffer todo.

- Inverter essa linha

- Voltar a colocar o cursor de ficheiro onde estava antes de ler

- escrever a linha invertida.

- Ficheiro acabou? Se sim, termina. Se não, volta atrás.

Ou seja, não precisas de ligar às decisões e "eventos" a accões logo à partida... deves comecar por partir o problema em problemas pequenos e ir resolvendo problema a problema até poderes ligar todas as resolucões numa só. É assim que funciona. Só podes fazer o fluxograma se já souberes quais são os problemas pequenos, senão é difícil de conjugar tudo porque não vais saber exactamente onde uma accão comeca e onde vai acabar. Tás a ver?

Podes também usar Português estruturado, ou inglês estruturado... ou seja, escreves o que o programa vai fazendo com uma linguagem semelhante à de programacão, mas sem grande atencão ao detalhe. Apenas colocando as ideias gerais do programa no papel.

Quanto a orientar-te, não acho que seja a pessoa indicada. Eu não sou um programador, e actualmente a linguagem de maior nível que uso é mesmo o C... para actuar bits. LOL Logo, se pretendes seguir para uma linguagem de alto nível, acho que deves encontrar alguém que faca disso profissão ou pelo menos hobby para te indicar qual o caminho a seguir. ;)

Quanto a praticar, pratica mais controlo de memória e apontadores. São um pouco mais importantes que acesso a ficheiros. :)


include <ai se te avio>

Mãe () {

}

Share this post


Link to post
Share on other sites
crazygod

sim vou fazer isso....

e quando eu me estava a referir a orientar, não era no sentido de passar para uma outra linguagem, mas era mais de, tipo indicares-me algumas livrarias onde eu podesse explorar mais o meu sistema operativo....

ja andei a ver uns livritos sobre o openGL porque seria interessante depois tentar fazer umas brincadeiras com aquilo....mas estou a pensar depois de acabar o meu livro de C (o do luis damas) estudar um pouco de sockets pois não percebo como funciona....e como a intenção é fazer depois um mini chat e coisas assim, era por isso que "ando parado" nos ficheiro e estruturas....

e sim vou tentar dedicar-me muito mais depois a manipulação da memoria e assim...(é o meu proximo capitulo ;))

Obrigado pela ajuda e pelos conselhos

Fika Bem

Share this post


Link to post
Share on other sites
bubulindo

ja andei a ver uns livritos sobre o openGL porque seria interessante depois tentar fazer umas brincadeiras com aquilo....

Isto já é fora do meu conhecimento, como disse a minha linguagem é C e fica-se por aí. Quanto a librarias para explorar o sistema operativo, não percebi muito bem o que pretendes... mas se calhar tens de perceber também o computador para poderes utilizar essas bibliotecas de forma segura.

mas estou a pensar depois de acabar o meu livro de C (o do luis damas) estudar um pouco de sockets pois não percebo como funciona....e como a intenção é fazer depois um mini chat e coisas assim, era por isso que "ando parado" nos ficheiro e estruturas....

e sim vou tentar dedicar-me muito mais depois a manipulação da memoria e assim...(é o meu proximo capitulo ;))

Eu não sou professor nem nada que se pareca, mas acho estranho entrar nos ficheiros sem falar em memória e apontadores. E enquanto sockets são interessantes, atira-te primeiro à memória e apontadores... depois antes de te meteres nas sockets, e para poupares um pouco de frustracão, estuda um pouco sobre redes. Utilizar sockets sem perceber o que são os protocolos que estás a utilizar e em que assentam vai deixar-te confuso. Não estou a dizer para tirares um mestrado em redes de computado


include <ai se te avio>

Mãe () {

}

Share this post


Link to post
Share on other sites
crazygod

sim percebi o que disses-te

e sim agora o que vou estudar é Memoria dinamica, depois as macros e pre-processador....

e sim, vou entao depois dar "uma vista de olhos" em como as redes funciona com a ajuda do google ;) e depois passo entao para as stockets...

so me falta fazer um exercicio (sobre estruturas) e depois vem a memoria e pelo o que ja li e visto também o que disses-te, vou ter mesmo que me dedicar um bocadinho mais a parte da memoria...

Obrigado

Share this post


Link to post
Share on other sites
Localhost

Digamos que um dos requisitos para se ser um bom programador em linguagens como C/C++ é ter um bom conhecimento de como a memória trabalha. Existem coisas que às vezes nos parece lógico fazer mas que não podemos fazer de maneira nenhuma porque nos pode criar um problema enorme (sem ter conhecimentos sobre como trabalha a memória podemos passar horas a fazer debug e nem descobrir o problema).

Um exemplo clássico que costumo dar é ter uma função onde está declarada uma string qualquer e nessa função temos que retornar essa mesma string.

O nosso pensamento imediato era:

#define MAX_LENGHT 1024

char * foo ()
{
    char my_string[MAX_LENGHT];

    fgets (my_string, MAX_LENGHT, stdin);
    printf ("String a ser retornada: %s\n", my_string);

    return my_string; // retorna endereço da string (que já não vai existir) = problemas...
}

int main (void)
{
    char *my_pointer = NULL;

    my_pointer = foo ();
    printf ("String recebida: %s\n", my_pointer); // estamos a receber o quê? Ups.

    return 0;
}

Isto em programas grandes ia originar o tão conhecido segmentation fault. Já agora deixo como exercício perceber o porquê disto.

Nota: Neste programa, que é pequeno, não daria segmentation fault.


here since 2009

Share this post


Link to post
Share on other sites
crazygod

hmm..ok vou ser sincero msm arriscando o meu pescoço...  ;)

se calhar se me pedisses para fazer esse tal programa, neste momento era isso que eu faria....

mas sim, olhando para isso com olhos de ver....vejo que quando o pc terminar de executar a função foo, logo o que a variavel my_pointer recebe é "lixo" que esta na memoria...

(sim acho que é isto, visto que a função foo acabou, todas as variaveis sao perdidas)

será que estou certo?? ou pelo menos nao muito longe da verdade!?

mas sim, eu de memoria em C é ZERO, mas sou sincero que não focem voçes, se tivesse dificuldades no capitulo da memoria "iria deixar para mais tarde resolver"...mas sendo assim...ok.....

alias, até porque depois eu gostaria (mas sim, eu tenho consciencia que isto não vai ser facil de eu fazer) de por exemplo com um programa feito por mim que me mostre de todos os programas que estao a ser utilizados no pc (que estao a correr) e conseguir alterar alguma variavel deles, para tentar modificar o comportamente....

mas uma coisa é certa esses voços conselhos não caem em "saco roto", visto que isto da dificil(€) para freq. a univ., aplico-me o maximo em casa!!

Share this post


Link to post
Share on other sites
bubulindo

por exemplo com um programa feito por mim que me mostre de todos os programas que estao a ser utilizados no pc (que estao a correr) e conseguir alterar alguma variavel deles, para tentar modificar o comportamente....

Isto só é aconselhável se fores alterar uma variável dum programa feito por ti... e mesmo assim, não faco ideia como ias saber a posicão de memória de determinada variável e depois conseguir aceder a ela... mas eu não sou o génio da programacão.


include <ai se te avio>

Mãe () {

}

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.