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

 

 


Tema destacado: Recopilación Tutoriales y Manuales Hacking, Seguridad, Privacidad, Hardware, etc


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [Duda] Pasando programa de C compilado en GCC a Visual Studio 2012
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Duda] Pasando programa de C compilado en GCC a Visual Studio 2012  (Leído 3,381 veces)
mokaNordic

Desconectado Desconectado

Mensajes: 7


Ver Perfil
[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


En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.966


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: [Duda] Pasando programa de C compilado en GCC a Visual Studio 2012
« Respuesta #1 en: 10 Diciembre 2014, 14:05 pm »

  • 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.

Compila mas no funciona como lo describiste, el tamaño de la variable local linea (almacenada en la pila) es constante: siempre es 20000. Que posteriormente cambies el valor de N no tiene ninguna incidencia sobre linea (si le indica fgets que el buffer tiene menos caracteres realmente). Yo me preocuparia mas por no duplicar el acceso a disco, abriendo, leyendo y cerrando de nuevo, mejor seria que usaras memoria dinamica y si fgets no devuelve el salto de linea - y no llego a EOF - leyeras nuevamente ...

  • ¿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

Dir\file.txt


« Última modificación: 10 Diciembre 2014, 14:20 pm por Eternal Idol » En línea

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
mokaNordic

Desconectado Desconectado

Mensajes: 7


Ver Perfil
Re: [Duda] Pasando programa de C compilado en GCC a Visual Studio 2012
« Respuesta #2 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! :)
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: [Duda] Pasando programa de C compilado en GCC a Visual Studio 2012
« Respuesta #3 en: 11 Diciembre 2014, 02:41 am »

¿Y si defino la variable char linea[N] después de obtener N?
Declarar un array cuyo numero de elementos se indica mediante un valor calculado en tiempo de ejecución (VLA, array de longitud variable) solo es posible si el compilador soporta el estándar C99 (en C90 no existe y en C11 (el ultimo) es opcional), si vas por esa aproximación solo queda revisar la documentación del compilador.

Otra opción ya la indico Eternal Idol, al utilizar las funciones para reserva dinámica de memoria (malloc, callo y realloc) te olvidas de ese problema.

Ya por ultimo no es necesario utilizar fgets y strlen para conocer la longitud de la cadena mas larga y verificar que el primer elemento del array no sea cero es innecesario ya que si fgets no retorna NULL significa que leyó y almaceno por lo menos un carácter en el array (mas el carácter '\0').

Una forma mas simple de obtener la longitud máxima incluyendo el carácter '\n' es mediante fgetc, mas o menos así:
Código
  1. FILE *p_fichero;
  2. int ch;
  3. long max_len;
  4. long len;
  5.  
  6. /* ... */
  7.  
  8. max_len = len = 0;
  9. while ((ch = fgetc(p_fichero)) != EOF){
  10.   len++;
  11.  
  12.   if (ch == '\n'){
  13.      if (len > max_len)
  14.         max_len = len;
  15.  
  16.      len = 0;
  17.   }
  18. }

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.966


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: [Duda] Pasando programa de C compilado en GCC a Visual Studio 2012
« Respuesta #4 en: 11 Diciembre 2014, 10:09 am »

¿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.

Olvidate del tamaño de la linea mas larga, no te sirve absolutamente para nada, lees todo el archivo para despues usar eso nuevamente para leer el archivo PERO aca esta la clave no tenes el archivo en memoria, tenes UNA sola linea al mismo tiempo asi que no tiene ningun sentido hacer ese calculo.

Lo mejor que podes hacer es una funcion que lea una linea completa usando memoria dinamica y llamarla dentro de un bucle.
« Última modificación: 11 Diciembre 2014, 10:50 am por Eternal Idol » En línea

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
mokaNordic

Desconectado Desconectado

Mensajes: 7


Ver Perfil
Re: [Duda] Pasando programa de C compilado en GCC a Visual Studio 2012
« Respuesta #5 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!
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.966


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: [Duda] Pasando programa de C compilado en GCC a Visual Studio 2012
« Respuesta #6 en: 12 Diciembre 2014, 14:01 pm »

De nadas  ::)
En línea

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
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Tengo un programa compilado en Microsoft Visual C++ v6.0 necesito un desambl....
Ingeniería Inversa
Pitoniso 3 3,334 Último mensaje 28 Junio 2007, 23:08 pm
por Shaddy
Visual studio 2012 y Avast de los co*****. « 1 2 »
.NET (C#, VB.NET, ASP)
xustyx 12 9,268 Último mensaje 18 Diciembre 2012, 22:22 pm
por xustyx
Implementar qt en visual studio 2012
Programación C/C++
patilanz 2 2,251 Último mensaje 24 Febrero 2014, 23:23 pm
por patilanz
Microsoft visual studio 2012 « 1 2 3 »
Programación C/C++
Kaxperday 23 10,609 Último mensaje 28 Septiembre 2014, 00:20 am
por Kaxperday
Duda, conectando visual studio 2012 con oracle express 10g 32 bits y window 8
.NET (C#, VB.NET, ASP)
Yaldabaot 0 2,471 Último mensaje 23 Marzo 2016, 18:32 pm
por Yaldabaot
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines