• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

diogo.delgaudio

Problema ao utilizar fopen

31 mensagens neste tópico

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

//void HelloTxt();
void manager();
char giveName();
void createTxt(char name);

main()
{
      manager();
      getch();
}

void manager()
{
     createTxt(giveName());
     
}     
void createTxt(char name)
{
     FILE *txt;
     if ((txt = fopen("'%c'.txt",name,"a+"))== NULL)
     
     {
              perror("Error!");
     }         
}

char giveName()
{
     char name;  
       do
       {
         printf("Write a name for your .txt\n");      
         scanf("\n%c",&name);
       }while (name==""));
       return name;
}

O erro é o seguinte:  24 invalid conversion from `char' to `const char*'

=z

valeu galera, obrigado pela ajuda!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tens vários erros nesse programa, para começar parece-me que o que tu queres é obter uma string do utilizador, logo devias declarar um array de chars.

Aqui fica uma versão corrigida:

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

#define MAX 20

char* giveName(char* name)
{  
   do {
        printf("Write a name for your .txt: ");
   } while (scanf("%s", name) < 0 );
   
   return name;
}

void createTxt(char* name)
{
     FILE* txt;
     strcat(name, ".txt");

     if ( (txt = fopen(name, "a+")) == NULL)
     {
              perror("Error!");
     }         
}

void manager()
{
     char name[MAX];
     createTxt(giveName(name));
}   

int main(void)
{
      manager();
      getch();
      
      return 0;
}

Basicamente crio um array de chars, com tamanho 20, depois passo um ponteiro dessa array para a função giveName(), que vai receber o input do utilizador e devolver o ponteiro para a função createTxt(). Depois através do strcat() acrescento ".txt" ao fim do nome, e abro um ficheiro através do fopen().

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

como disse no outro post, estou começando em C e não entendi muito bem o código, porém funcionou! :)

obrigado pela ajuda, triton! :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Porque é que se define a funcao givename com retorno de um ponteiro e porque é que o argumento tb é um ponteiro ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

o argumento é uma string, que é um array de chars, que é o mesmo que um apontador para um char. ou seja, a função givename recebe uma string (o local onde vai colocar o resultado), e devolve essa mesma string (o que nem era necessário, visto que apenas alteramos o valor do argumento).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

o argumento é uma string, que é um array de chars, que é o mesmo que um apontador para um char. ou seja, a função givename recebe uma string (o local onde vai colocar o resultado), e devolve essa mesma string (o que nem era necessário, visto que apenas alteramos o valor do argumento).

Seria necessário em que casos ??

Eu já percebi que passa-se um ponteiro para modificar o valor real dele certo ??

Se eu por exemplo quiser trocar algumas letras dentro de um array tenho que lhe passar o ponteiro, right ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se eu por exemplo quiser trocar algumas letras dentro de um array tenho que lhe passar o ponteiro, right ?

Sim, cada vez que queres alterar o valor de uma variável através de uma função tens de utilizar ponteiros.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se eu por exemplo quiser trocar algumas letras dentro de um array tenho que lhe passar o ponteiro, right ?

Sim, cada vez que queres alterar o valor de uma variável através de uma função tens de utilizar ponteiros.

Ok obrigado ;)

E Retornas um ponteiro nessa função porquê ??? Para apontar para o primeiro elemento do array ?

Por exemplo se fosse um inteiro ao invés de um array, recebias um ponteiro mas retornavas um int normal ( querendo alterar o seu valor)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

E Retornas um ponteiro nessa função porquê ??? Para apontar para o primeiro elemento do array ?

Eu retornei o valor do ponteiro para passar esse valor à função createTxt, que recebe o ponteiro como argumento.

Por exemplo se fosse um inteiro ao invés de um array, recebias um ponteiro mas retornavas um int normal ( querendo alterar o seu valor)

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

void update(int *ptr, int value)
{
    *ptr = value;
}

int main()
{
    int a = 10;
    printf("%d\n", a);
    update(&a, 20);
    printf("%d\n", a);
    return 0;
}

Output:

10

20

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

mas c não tem o tipo string então?

Não. Em C Strings são apenas arrays de caracteres.

Não é só em C, várias linguagens não teem o conceito de Strings. E muitas linguagens com o tipo String é apenas açúcar sintáctico para arrays de de caracteres, com optimizações internas.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

omg, é uma das maiores surpresas da minha vida! :o

obrigado pelos esclarecimentos, pessoal!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

eu acho que é muito boa ideia aprenderes a trabalhar com os arrays de caracteres no C, embora causem algumas dores de cabeça ao inicio, mas depois quando usares os objectos String do Java ou C++ , já percebes +/- como aquilo funciona :)

Não esquecendo que normalmente se conseguem melhores tempos de execução ao manipular as strings directamente em arrays de caracteres  :(

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

mto interessante com relação ao tempo de execução... não sabia disso( mais uma)!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

É, porque as strings manipuladas enquanto classes, por exemplo, dispõem do mesmo array, e de muitos mais serviços.... quantos mais serviços mais memória/tempo de execução....

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Atenção que gasto de memória não implica maior gasto no tempo de execução. Normalmente até se troca uma coisa pela outra.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Atenção que gasto de memória não implica maior gasto no tempo de execução. Normalmente até se troca uma coisa pela outra.

é verdade, mas certamente será mais rápido tu fazeres str[10] do que str.at(10) que o que faz é algo do género:

char at(int pos)
{
    if(pos < 0 || pos > strlen(array))
        throw new //"OutOfBounds()";
    else
        return array[pos];
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Atenção que gasto de memória não implica maior gasto no tempo de execução. Normalmente até se troca uma coisa pela outra.

Estava prestes a dizer o mesmo. ^-^

é verdade, mas certamente será mais rápido tu fazeres str[10] do que str.at(10) que o que faz é algo do género:

Depende da implementação da linguagem, algumas fazem bound checking sempre que acedes a um array, mas na maioria das situações tens razão.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

E neste caso a memória a mais faz-se sentir.......

Quando se passa uma string por valor para uma função, não se passa um array apenas, passa-se a classe com todos os seus serviços.....

A memória a mais não fará diferença se ficar parada, porque se tivermos que andar a passeá-la, concerteza que será diferente....

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

não se passa um array apenas, passa-se a classe com todos os seus serviços.....

Não percebi! Manda os valores da estrutura sim...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Também não percebi o que queria dizer com com todos os seus serviços

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

os serviços tipo "size", "at", "substr", "append", tudo o que possas associar a uma string...

shumy, eu é que não percebi o que é que queres... Não respondeste a nada do que tenha dito....

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu na verdade estava a questionar. Desculpa não ter colocado o ponto de interrogação.

O que é passar serviços? Foi isso que não percebi.

Ou passar a classe?

Por valor é apenas uma cópia da estrutura de dados.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Exacto... E a estrutura de dados implica funções, variáveis, etc.....

Um array ocupa menos memória que uma classe como esta com que estamos a lidar, portanto a memória extra fará a sua diferença no tempo de execução.... Mas é um caso isolado.....

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

os serviços tipo "size", "at", "substr", "append", tudo o que possas associar a uma string...

shumy, eu é que não percebi o que é que queres... Não respondeste a nada do que tenha dito....

Presumo que querias dizer métodos. Mas tu a passares uma instancia de uma classe de uma lado para outro não estás a passar os métodos juntamente. Internamente o compilador atribui vários valores à instancia, um deles é o tipo. Quando chamas um método na instancia, internamente o que está a acontecer é ir ver o tipo, vai a uma zona mágica, procura por um método com aquela assinatura para aquele tipo, e redireciona a execução do código para essa zona. É claro que é mais complexo do que isto mas dá para ter a ideia. Se os métodos estivessem guardados em cada instancia a performance seria terrivel.
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora