elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


  Mostrar Mensajes
Páginas: [1]
1  Programación / Programación C/C++ / Re: [Duda] Pasando programa de C compilado en GCC a Visual Studio 2012 en: 12 Diciembre 2014, 13:54 pm
He aplicado los cambios que me habéis comentado y ya funciona sin problema =)

Al final he usado ambas ideas. Aplicar fgetc a la par que reservada memoria con malloc y realloc.

Así que muchas gracias rir3760 y Eternal Idol
Un saludo!
2  Programación / Programación C/C++ / Re: [Duda] Pasando programa de C compilado en GCC a Visual Studio 2012 en: 11 Diciembre 2014, 02:01 am
Buenas!
Gracias por tu respuesta.

¿Entonces si de esta forma no altero el tamaño N de línea cómo lo planteo?
Aunque use memoria dinámica para guardar cada línea del fichero, en la función fgets hay que indicar una cantidad de caracteres a leer en mi caso N.

Por eso tratar de obtenerlo antes. Así no lee 200000 caracteres sino tamMax

¿Y si defino la variable char linea[N] después de obtener N?


Lo de la ruta entendido! :)
3  Programación / Programación C/C++ / [Duda] Pasando programa de C compilado en GCC a Visual Studio 2012 en: 10 Diciembre 2014, 13:48 pm
Hola buenas!!

He realizado una series de funciones que compilándolas con el GCC funcionan sin problema, pero necesito pasarlo al entorno de desarrollo Visual Studio 2012.

En una de las funciones, tengo que leer un fichero.
Preguntas:
  • El fichero no se el tamaño que puede tener una línea, de modo que abro el fichero una 1º vez , lo recorro entero y guardo el tamaño de la línea de mayor tamaño (tamMax) y lo igualo a N, pasando de tener un buffer gigantesco a uno apropiado.
    Este procedimiento compilandolo en GCC funciona, pero en Visual Studio no.

    error C2057: se esperaba una expresión constante   en linea[N]

    Como solución he visto que me plantean usar:
    #define int N;

    El problema es que al ser define no puedo cambiar su valor y por tanto, en la línea 30 salta error.

  • ¿Cómo hago para tratar usar la ruta relativa en el fichero? Desde el directorio actual quiero crear un directorio y dentro tener el .txt

Código
  1. #include "librerias.h"
  2.  
  3. int N;
  4. #define CRT_SECURE_NO_WARNINGS
  5.  
  6. int leer_fichero_operComp()
  7. {
  8. N=20000;
  9. FILE *p_fichero=NULL;
  10. char linea[N];
  11. int i=0,j=0,tam,tamMax=0;
  12. char *ficheros[] = {"hola.txt","adios.csv"};
  13.  
  14. if((p_fichero=fopen(ficheros[0],"r"))==NULL)
  15. {
  16. printf("Error al abrir el fichero");
  17. exit(-1);
  18. }
  19. else{
  20. while( fgets(linea,N,p_fichero) != NULL)
  21. {
  22. if( linea[0] != '\0')
  23. {
  24. tam=strlen(linea);
  25. if(tam > tamMax)
  26. tamMax = tam;
  27. }
  28. }//while
  29. fclose(p_fichero);
  30. N=tamMax;
  31.  
  32. p_fichero=fopen(ficheros[0],"r");
  33. while( fgets(linea,N,p_fichero) != NULL)
  34. {
  35. if( strlen(linea) > 1)
  36. {
  37. tam=strlen(linea);
  38. sscanf(linea,"%[^\n]",linea);
  39. printf("\n\t Linea %d :%s ",j,linea);
  40. j++;
  41. }
  42. }//while
  43. fclose(p_fichero);
  44. }//else
  45. return 0;
  46. }
  47.  
  48.  
  49.  

PD: No se si debería haber puesto este tema en otro foro no de C
4  Programación / Programación C/C++ / Re: [Ayuda] Duda Strtock en C en: 2 Diciembre 2014, 21:37 pm
Buenas,
Fallo mio al copiar el trozo de código aquí. En el programa esta bien jeje sino ni me compilaria.Pero gracias por la observación :)
5  Programación / Programación C/C++ / [Ayuda] Duda Strtock en C en: 2 Diciembre 2014, 20:22 pm
Hola buenas,
He usado el comando strtock en C muchísimas veces y nunca se me había planteado un problema del estilo. El caso es que lo estaba usando para leer líneras   de un fichero donde el caracter que separa los tokens es ; .
Creo un bucle diciendo que cuando no haya más tokens(null) pues finalice.
   
El tema, es que cada token, pues tengo que tratarlo...guardarlo, etc etc... llamadas a funciones.
Pues de forma "misteriosa" cuando llamo a una función en concreto,
hace que no haya más tokens de modo que deja de analizar el resto de la línea.
   
A esa función, la única relación que hay con strtock es que le paso una copia del token (no el puntero original).

Cuando la función en cuestión la quito, strtock funciona perfectamente y lee todos los tokens.
Muestro parte del código para hacer una idea:

Código
  1. char *ptr;
  2.        char delimitador[] = ";";
  3. ptr = strtok( NULL, delimitador);  
  4. char retorno_nombre[20];
  5. char token_extraido[20];
  6. int contador=0;
  7.  
  8. ptr = strtok( linea, delimitador);  
  9. do{
  10. ...
  11. if(contador == 0)
  12. //Funciones , inclusive la misma que en el siguiente if da problemas.
  13. //contador ++
  14. else if(contador ==1){
  15. strcpy(token_extraido,ptr);
  16. printf("Token (nombre):%s",token_extraido);
  17. strcpy(retorno_nombre,buscarNombre(token_extraido));
  18. printf("Nombre retornado:%s",retorno_nombre); //Las funciones funcionan correctamente
  19. contador++;
  20. }
  21. else if(contador >=2)
  22. //Otras funciones. Aqui no entra ya como tenga la funcion buscarNombre del anterior if.
  23.  
  24. }while((ptr = strtok( NULL, limitador ) !=NULL);

¿Alguna vez a alguien le ha pasado algo parecido? ¿Saben porqué podría ser si no hay relación directa entre el puntero ptr y la llamada o retorno de esa función?

Un saludo, y muchas gracias de antemano.
6  Programación / Programación C/C++ / Re: [Ayuda] Array dinamico malloc/realloc con puntero doble en: 28 Noviembre 2014, 01:36 am
Buenas!

Gracias por la bienvenida y gracias por tu respuesta.
Diste en el clavo porque ahora funciona perfectamente, tanto el programa de testeo como la aplicación real en la que trabajaba.
Tomo buena nota también del fflush, y sobre el tamaño de los nombres aunque tienes razón, no tiene mayor relevancia ya que solo pasaba en el programilla ese de prueba.

Un saludo y muchas gracias,
7  Programación / Programación C/C++ / [Ayuda] Array dinamico malloc/realloc con puntero doble en: 26 Noviembre 2014, 14:11 pm
Buenas tardes,
Estoy trabajando en un programa que lee ficheros, saca ciertos datos etc etc...
Linea por linea del fichero csv voy extrayendo el contenido con strtok y lo voy guardando en arrays.
El programa lee unas cuantas lineas pero luego falla y se sale sin dar mayor explicación.

Como imagino que será que no reservo bien memoria, he aislado el cómo trato la memoria con un pequeño programa (el que incluyo) donde se pide añadir una serie de nombres de Alumnos, y después pedir más.

El programa según añado cambios, he llegado a conseguir que lo visualice bien y finalice...pero se comporta bastante mal.

Por ejemplo si pongo un system("pause") antes de sacar por pantalla el listado final (el último for), y el numero de alumnos nuevos es menor que el numero de alumnos añadidos inicialmente lo muestra bien.
Si el numero de alumnos nuevos supera al inicial, aun con esa pausa, el programa falla.

He comparado, mirado webs, inclusive en este foro en temas anteriores para tratar de solventarlo... y no doy con la cuestión.

Gracias de antemano, toda posible pista seguro que me es de ayuda.
Un saludo

Adjunto el código:

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#define NOMBRE 20

typedef struct{
                //... demás variables que no afectan a la cuestion .../
      char **listado_alumnos;
      }registro;
      
int alumnado(registro *profesor);


void main(){
   registro profesor;
   alumnado(&profesor);
}
      
int alumnado(registro *profesor)
{
     int cant, i,n_mas,tam;
     char cdn[100];
     system("cls");
     printf("Numero de alumnos: ");
     scanf("%d", &cant);
     fflush(stdin);
   
    profesor->listado_alumnos = (char **)malloc(cant * sizeof(char)); //reservo "filas"
    if(profesor->listado_alumnos==NULL){
         fprintf(stderr,"Error en la asignacion de memoria");
         exit(-1);
         }
         
     for(i = 0; i < cant; i++)
     {
      printf("Nombre Alumno %d: ", i + 1);
                scanf("%s",&cdn);
      fflush(stdin);
      profesor->listado_alumnos=(char*)malloc(NOMBRE*sizeof(char)); /*reservo "columnas" */
      strcpy(profesor->listado_alumnos,cdn);
     }
       
   //IMPRIMO
     printf("LISTA DE ALUMNOS\n--------------------\n");
     for(i = 0; i < cant; i++)
        printf("->%d.\t%s\n", i + 1, profesor->listado_alumnos);
   
      //sin añadir la parte de realloc ya falla el programa
   
   printf("\n Cuantos alumnos mas quieres incluir:");
   scanf("%d", &n_mas);
        fflush(stdin);
   
   int tam_total= n_mas+cant;
   profesor->listado_alumnos=realloc(profesor->listado_alumnos,(tam_total)*sizeof(char *));/*reasigno "filas"*/
   
   for(i = cant+1; i <(tam_total+1); i++) //reasigno "columnas"
          {
      printf("Nombre Alumno %d: ", i + 1);
           scanf("%s",&cdn);
      fflush(stdin);
           profesor->listado_alumnos = (char*)malloc(NOMBRE*sizeof(char));
      strcpy(profesor->listado_alumnos,cdn);
          }
   //IMPRIMO 2º ronda
    printf("ALUMNOS NUEVOS\n--------------------\n");
         for(i = cant+1; i <(tam_total+1); i++)
        printf("->%d.\t%s\n", i + 1, profesor->listado_alumnos);
   
    //system("pause");
    //imprimo todo el listado_alumnos   
    printf("LISTA TOTAL DE ALUMNOS\n--------------------\n");
         for(i = 0; i < tam_total; i++)
        printf("->%d. \t %s \n", i + 1, profesor->listado_alumnos);

   //libero memoria
   for(i=0;i<tam_total;i++){
      free(*(profesor->listado_alumnos+i));
    }
   free(profesor->listado_alumnos);
   
     system("pause");
     return 0;
   
}

Páginas: [1]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines