Dudas sobre las funciones void en C

Iniciado por niñoAtómico, 11 Octubre 2013, 01:11 AM

0 Miembros y 1 Visitante están viendo este tema.

niñoAtómico

Hola Gente:

Me dieron esta consigna:

Crear un programa en C que tenga un menú, de dos opciones. crear archivo y leer archivo. Lo resolví así:

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

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int textocrea();
int textolee();
int main() {
   
   
   //char text [1000];
   //char entrada [1000];
   int opcion = 0;
   printf("Seleccione la opcion:\n");
   printf("Opcion 1) crear texto en archivo\nOpcion 2) Leer archivo\n");
   scanf("%i", &opcion);
   switch(opcion){
      case 1:
         textocrea();
         break;
      case 2://funciona!!!
           textolee();
           break;
      default:
          printf("Selecciono una opcion no existente\n");   
         break;   
   }
      
   return 0;
}
  textocrea()
{
    FILE *vfile;
    char caracter[1000];
    vfile = fopen("d:/texto.txt", "w");
    if(vfile==NULL){
        printf("Error al crear archivo\n");
     }
   
    printf("Ingrese el texto\n");
    scanf( " %[^\n]",&caracter );
   fputs(caracter, vfile);           
    fclose(vfile);   
    return 0;   
  }
textolee()
{
   FILE *vfile;
   char caracter [1000];
   vfile = fopen("d:/texto.txt", "r");
   if(vfile==NULL){
        printf("Error al crear archivo\n");
     }
     while(!feof(vfile)){
        
        fread(&caracter, sizeof(caracter), 1, vfile);
        
        printf("%s", caracter);
          }
   
   fclose(vfile);
   
   return 0;
   
   
    }


Sin embargo me dice mi profe que por qué no definí las funciones como void. Probé y no funcionan con void. Tampoco funciona el gets en vez del scanf. Alguien sabe por qué pasa esto? Cómo es lo de las funciones void?


Desde ya gracias Chicos!!!
"Los genios son idiotas insistentes..."

Eternal Idol

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

niñoAtómico

Gracias!!! Te copas y escribis un ejemplo?

Y un misterio es por qué no funciona con gets y sí con scanf... Si lo prueban con gets devuelve cero y no pide el string, es raro...

Gracias!!!
"Los genios son idiotas insistentes..."

Eternal Idol


void f1();

void f1()
{
//codigo aca
//no usar return
}


gets es una funcion insegura que no permite especificar el tamaño del buffer, es mejor no usarla jamas.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

niñoAtómico

Muchísimas gracias, era algo simple que nadie me sabía decir.

Buena onda!!!  ;-)

"Los genios son idiotas insistentes..."

Eternal Idol

De nada  ::) Igual te recomiendo conseguir algun libro, asi vas a tener una buena base y poder resolver casi todos tus dudas.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

vangodp

Código (cpp) [Seleccionar]


#include <iostream>
#include <windows.h>
using namespace std;

main ( )
{
    cout << "Hola" << endl;
    system ("pause>nul");
}



A mi este mini código me ha funcionado :D

El return/int en main es por potabilidad y para obtener códigos de errores?
Creo que para obtener parámetros externos de otras aplicaciones no es eso??
Soy muy nobs y me gusta aprender también XD
tks Idol ;-)

Eternal Idol

Es para que el que llama a tu programa pueda obtener un resultado del mismo de manera sencilla. Notese que yo no use void para main.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

niñoAtómico

Tengo dos libros muy copados de Deitel y deitel sobre programación que me dan en la facu, pero lo del void no estaba bien explicado...   :-[ Que hace el minicódigo?

Saludos...
"Los genios son idiotas insistentes..."

vangodp

Mira no es que los libros sean malos ok eso es lo que pasa por aprender de los libros.
As veces pillas algo y no tienes nadie para poder preguntar.
Como sabes un programa siempre devuelve algo a menos que digamos el contrario con el void.
main es una función igual que todas las demás.
Tiene que ser main por que es la primera función que llama el compilador.
Se supone que una función hace algo no?
Como cuando llamas a una función que suma 2 números esperas algo de ella.
Pos bien...a main le pueden llamar otros programas externos y puede recibir parámetros como todas las demás funciones, (no te olvides main es una función y las funciones reciben y devuelven valores) o así creo que es.
Y ese programa puede estar esperando que main le devuelva algo, cosa que no siempre o casi nunca es cierto, pero puede pasar.
Al igual que main también puede esperar datos entre ().
Se supone que cuando un programa no retorna nada debemos ponerle un void de retorno.
Pero no nos va doler si ponemos como int y al final le ponemos que no retorna nada.
Ademas ni es necesario poner el return aun que si es muy muy recomendable, pero ya ves tu el problema de no ponerlo XD
Se recomienda poner return 0; dicen que es por portabilidad ni idea jaja.
Así que creo que siempre siempre deberías poner como int main por que en realidad da igual hasta el día que te haga falta usar el return de main y sus () para recibir argumentos.
Bueno eh explicado aquí lo poco que se, comparado con algunos aquí soy una pulga pero si me equivoco que alguien me corrija.  :rolleyes: