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

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


  Mostrar Mensajes
Páginas: 1 ... 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 [19] 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 ... 51
181  Programación / Programación C/C++ / Re: Guardar variables en ficheros C en: 16 Diciembre 2013, 13:36 pm
Citar
Gracias por la respuesta, pero no me has solucionado nada. igual es que no te he entendido.

Sin ofender, pero yo añadiría a eso las ganas que te lo den todo hecho. Si te miras el ejemplo que hay en en enlace de la función fgetpos() lo entenderás. Entiendo que es mucho trabajo copiar y pegar el código, compilarlo, y correrlo tú mismo para hacer la prueba, así que te dejo el código y la salida aquí:

Código
  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5.  char nombre[11] = "datos4.dat",
  6.       mensaje[81]="Esto es nua rpueba usando fgetpos y fsetpos.";
  7.  FILE *fichero;
  8.  fpos_t posicion=0, comienzo;
  9.  
  10.  fichero = fopen( nombre, "w+" );
  11.  printf( "Fichero: %s -> ", nombre );
  12.  if( fichero )
  13.    printf( "creado (ABIERTO)\n" );
  14.  else
  15.  {
  16.    printf( "Error (NO ABIERTO)\n" );
  17.    return 1;
  18.  }
  19.  
  20.  fgetpos( fichero, &comienzo );
  21.  printf( "Posicion del fichero: %d\n", posicion );
  22.  
  23.  fprintf( fichero, mensaje );
  24.  printf( "\nEscrito: \"%s\"\n", mensaje );
  25.  
  26.  fgetpos( fichero, &posicion );
  27.  printf( "Posicion del fichero: %d\n", posicion );
  28.  
  29.  fsetpos( fichero, &comienzo );
  30.  fprintf( fichero, "%s", "Esto es una prueba" );
  31.  printf( "Corregiendo errores...Escrito: \"Esto es una prueba\"\n" );
  32.  
  33.  fgetpos( fichero, &posicion );
  34.  printf( "Posicion del fichero: %d\n", posicion );
  35.  
  36.  rewind( fichero );
  37.  printf( "\"Rebobinando\" el fichero -> Vuelta al comienzo\n" );
  38.  fgetpos( fichero, &posicion );
  39.  printf( "Posicion del fichero: %d\n", posicion );
  40.  
  41.  printf( "\nLeyendo del fichero \"%s\"\n", nombre );
  42.  fgets( mensaje, 81, fichero );
  43.  printf( "\"%s\"\n\n", mensaje );
  44.  
  45.  fgetpos( fichero, &posicion );
  46.  printf( "Posicion del fichero: %d\n", posicion );
  47.  
  48.  if( !fclose(fichero) )
  49.    printf( "Fichero cerrado\n" );
  50.  else
  51.  {
  52.    printf( "Error: fichero NO CERRADO\n" );
  53.    return 1;
  54.  }
  55.  
  56.  return 0;
  57. }

Y su salida:
Código:
:~$ ./fichero 
Fichero: datos4.dat -> creado (ABIERTO)
Posicion del fichero: 0

Escrito: "Esto es nua rpueba usando fgetpos y fsetpos."
Posicion del fichero: 44
Corregiendo errores...Escrito: "Esto es una prueba"
Posicion del fichero: 18
"Rebobinando" el fichero -> Vuelta al comienzo
Posicion del fichero: 0

Leyendo del fichero "datos4.dat"
"Esto es una prueba usando fgetpos y fsetpos."

Posicion del fichero: 44
Fichero cerrado

Y qué sacamos de todo esto? Tú cuando abres un fichero el cursor asociado a él estaría en la posición 0. Si con fgets(), o la función que sea, lees 10 carácteres (por ejemplo, los correspondientes a tus variables), entonces el cursor avanzará a la posición 10. Si luego quieres sobrescribir las variables que tenías, deberás hacer retroceder el cursor, con rewind(), con fsetpos() o con fseek() (no será porque no tengas opciones), para así cuando escribas las variables éstas sobrescriban a las que habían.

Citar
Mi verdadera duda esta en como hacer que me almacene el valor de la variable, es que no consigo hacer que me escriba nada.
fprintf()

Un saludo.
182  Programación / Programación C/C++ / Re: Guardar variables en ficheros C en: 16 Diciembre 2013, 01:41 am
Si en el fichero solamente tienes esas dos variables y quieres modificarlas las dos podrías usar la función rewind(). Lo que consigues con esta función es situar en el inicio el cursor asociado al fichero, por lo que la próxima vez que escribas en él sobrescribirás lo que haya, en lugar de añadirlo al final.

Si tuvieras muchas variables y solo quisieras modificar unas cuantas, deberás jugar con las funciones fsetpos(), fgetpos() y fseek() para ir moviendo el cursor del fichero hacia donde quieras leer y/o escribir.

Saludos.
183  Programación / Programación C/C++ / Re: Arreglos,punteros y sprintf.- en: 12 Diciembre 2013, 23:16 pm
Eso te ocurre porque fgets() también guarda el salto de línea en el bufer que le pases como parámetro.

Una manera de solucionar esto podría ser eliminar el salto de línea '\n' del final de la cadena después de cada fgets(). Por ejemplo:

Código
  1. printf("\n\n Ingrese primer nombre.....: ");
  2. fgets(ptrPN, MAX, stdin); // ptrPN="Pepe\n"
  3. ptrPN[strlen(ptrPN)-1]='\0'; // ptrPN="Pepe"

No te olvides de incluir string.h si usas la función strlen().

Saludos.
184  Programación / Programación C/C++ / Re: (Ayuda) Solución parcial de un ejercicio C++ utilizando vectores. en: 7 Diciembre 2013, 03:40 am
Hola a tod@, tengo que escribir un programa que lea un número, que indica cuántos números enteros serán guardados en un vector, crear el vector para almacenar el tamaño exacto de los datos y entonces leer los enteros que serán guardados en el vector. Posteriormente se han de mostrar los elementos en orden inverso y liberar la memoria que se ha reservado.

Arrays: http://bit.ly/1f4Vo2A
Memoria dinámica: http://bit.ly/1f4VxTF

No tardarás más de media hora si te pones.

Saludos.
185  Programación / Programación C/C++ / Re: paso de parametros a la funcion main y archvos pbm en: 24 Noviembre 2013, 18:13 pm
@mDrinky Si le pasas 3 parámetros entonces entrará en el if y habrá que manejar el error, donde luego se acabará el programa con el return. Para continuar con el programa no se debería entrar en ese if, y la única condición para que no entre ahí es que tan solo haya 1 argumento (argc igual a 2), que es lo que el user pide.

kikian94 Ahora que me fijo me dejé la comprobación de que sean máximo 32 carácteres, aunque bueno para eso solo bastaría poner un contador dentro del bucle en el que verificas que solo hayan 1s y 0s y luego con un if comprobar que ese contador no sea mayor a 32; o sino también usando la función strlen().

Saludos.
186  Programación / Programación C/C++ / Re: paso de parametros a la funcion main y archvos pbm en: 24 Noviembre 2013, 17:37 pm
No sé que es el formato pbm pero para hacer el programa que pides deberías seguir más o menos algo así:

1. primero verificar que el programa solo tenga 1 argumento y que éste solo esté compuesto por 1s y 0s.
2. para cada caracter del argumento, comprobar si es un 1 o un 0 y hacer lo que quieras hacer con eso.


Código
  1. // verificar que haya un solo argumento
  2. if (argc!=2)
  3. {
  4.    // manejas el error
  5.    return 1;
  6. }
  7.  
  8. // verificar que solo sean 1s y 0s
  9. for (i=0; argv[1][i]!='\0'; i++)
  10. {
  11.    if (argv[1][i]!='1' && argv[1][i]!='0')
  12.    {
  13.         // manejas el error
  14.         return 1;
  15.    }
  16. }
  17.  
  18. // procesas el argumento
  19. for (i=0; argv[1][i]!='\0', i++)
  20. {
  21.    if (argv[1][i]=='1')
  22.    {
  23.        // procesas los 1s
  24.    }
  25.    else
  26.    {
  27.        // procesas los 0s
  28.    }
  29. }

Saludos.
187  Programación / Programación C/C++ / Re: desbordamiento de arreglos en: 24 Noviembre 2013, 15:37 pm
Código
  1. int VerificarCelda(int total_filas, int total_columnas, int fila, int col, int x)
  2. {
  3.     if (fila+x<total_filas && col+x<total_columnas) return 1;
  4.     return 0;
  5. }

Donde total_filas y total_columnas son las dimensiones de la matriz, fila y col son la fila y columna donde se encuentra actualmente el usuario y x son el numero de filas y columnas que se mueve. Si devuelve 1 es que la nueva posición es correcta y 0 en caso contrario.

Saludos.
188  Programación / Programación C/C++ / Re: paso de parametros a la funcion main y archvos pbm en: 24 Noviembre 2013, 14:35 pm
argc te dice el número de argumentos pasados al programa. El mismo nombre del programa cuenta como un argumento, por lo que si no le pasas ninguno más tendrá el valor 1.

argv es un array de cadenas con cada uno de los argumentos pasados. La primera es el mismo nombre del programa y a partir de ahí cada uno de los argumentos pasados.

Por ejemplo, imagínate que llamas a tu programa así:
Código:
./miprograma argumento1 argumento2

Entonces en tu programa los valores de esas dos variables serían:
Código:
argc=3
argv[0]="./miprograma"
argv[1]="argumento1"
argv[2]="argumento2"

Si no te queda aun muy claro, ejecuta este programa jugando un poco pasándole diversos números de parámetros.
Código
  1. #include <stdio.h>
  2. int main(int argc, char **argv)
  3. {
  4.     int i;
  5.     for (i=0; i<argc; i++) printf("Argumento %d: %s\n", i, argv[i]);
  6.     return 0;
  7. }

edito: Después de lo que dijo mDrinky, también puedes acceder a cada uno de los carácteres añadiendo un índice más a argv. Por ejemplo para acceder al primer y tercer carácter del primer argumento pasado al programa sería:
Código:
argv[1][0]     // primer caracter del primer argumento
argv[1][2]     // tercer caracter del primer argumento
argv[3][1]     // segundo caracter del tercer argumento

Saludos.
189  Programación / Programación C/C++ / Re: Pasar de char a uint8_t...... me estoy volviendo majareta! en: 16 Noviembre 2013, 02:39 am
Igual me equivoco pero... un entero sin signo de 8 bits no es lo mismo que un char? Yo haría un casting rápido para evitar posibles quejas del compilador y listo.

Código
  1. char a=0xFF;
  2. uint8_t b=(uint8_t)a;

Saludos.
190  Programación / Programación C/C++ / Re: Problema de puntero en: 7 Noviembre 2013, 13:19 pm
Código
  1. int a[2][6];
  2. int *b;
  3. b = *a;

a es un array de punteros a entero, o lo que es lo mismo es una matriz bidimensional de enteros (int**).

b es un puntero a entero, o lo que es lo mismo es un array de enteros (int*).

Así pues, cuando haces b=*a es porque estas desreferenciando el puntero a un nivel, por lo que le estas pasando a b la dirección de la primera fila de la matriz a. Es lo mismo que si hicieras b=a[0] o b=&a[0][0].

En la función modificar, le pasas como parámetro *a, y como a es del tipo int**, lo que le pasas a la función es del tipo int* (porque desreferencias una vez con el asterisco), por lo que a la función solo le llega un vector de enteros que en este caso sería la primera fila de la matriz a.

Saludos.
Páginas: 1 ... 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 [19] 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 ... 51
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines