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

 

 


Tema destacado: Guía actualizada para evitar que un ransomware ataque tu empresa


  Mostrar Mensajes
Páginas: 1 2 3 4 5 6 7 8 9 10 [11] 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 ... 160
101  Programación / Programación C/C++ / Re: Duplicar un archivo de texto plano con lenguaje C. en: 5 Marzo 2015, 15:27 pm
Las funciones fscanf, scanf y sscanf retornan el numero de conversiones realizadas con éxito. La condición del bucle:
Código
  1. while (fscanf(ptrBdd, " %[^:]:%d:%s", campoUno, &campoDos, campoTres) == 3)
  2.   printf( "%s %d %s\n", campoUno, campoDos, campoTres);
  3. fclose (ptrBdd);
Compara el resultado de fscanf con el valor tres porque este es el numero de conversiones que debe realizar la función al leer cada registro. En otras palabras "Mientras se lean con éxito los tres campos que componen un registro ellos se imprimen en la salida estándar".

Si no tienes una referencia de la biblioteca estándar de C dos (en ingles) que puedes utilizar son:
Plauger C90 Reference
C Plus Plus: scanf

Un saludo
102  Programación / Programación C/C++ / Re: [C] Llenar archivo Binario, y borrar datos mayores al promedio en: 5 Marzo 2015, 02:57 am
antes de este while, ¿es necesaria una lectura previa como con el feof?
No es necesario, esa es una de las razones por las cuales no se recomienda feof: te obliga a duplicar las operaciones de lectura. En el caso que mencionas basta con una sola llamada fread la cual sirve como condición del bucle.

Si te interesa ahondar sobre las razones para no usar feof te recomiendo utilizar el motor de búsqueda de los foros, encontraras una media docena de mensajes sobre ello.

Código
  1. while (fread(&dato,sizeof(dato),1,arch) == 1)

Por otro lado, no entiendo una cosa, la condicion dice que mientras fread() == 1, ¿Cómo es eso que el fread puede ser igual o distinto a 1? Porque te refieres explicitamente a la función fread, y no a la variable donde almaceno el valor (dato).
Explico: la función fread trata de leer del stream indicado (cuarto argumento) el numero de elementos (tercer argumento) del tamaño indicado (en bytes, segundo argumento) y los almacena a partir de la dirección indicada (primer argumento).

Su valor de retorno es el numero de elementos leídos con éxito y que en tu caso si es uno indica una lectura exitosa lo que nos lleva a olvidarnos de feof (si la función retorna cero ello indica que se activo el indicador de error o fin de archivo).

Un saludo
103  Programación / Programación C/C++ / Re: [C] Llenar archivo Binario, y borrar datos mayores al promedio en: 4 Marzo 2015, 16:59 pm
me gustaría tener una explicación de porque se solucionó con ese fseek, el de la línea 17, ya que no me queda muy claro.
No debes utilizar feof para controlar el bucle de lectura de datos, en su lugar puedes utilizar el valor de retorno de la función fread con lo cual el bucle termina así:
Código
  1. while (fread(&dato,sizeof(dato),1,arch) == 1)
  2.   if (dato > prom){
  3.      fseek(arch, -1 * (int) sizeof(dato), SEEK_CUR);
  4.      fwrite(&menosuno, sizeof(menosuno), 1, arch);
  5.   }

Es necesario utilizar fseek porque cada vez que lees/escribes en un archivo el indicador de posición de este avanza a la siguiente posición, si no fuera así y, por ejemplo, tratas de leer diez valores en las diez ocasiones leerías el mismo valor.

En resumen con fread lees un valor, el indicador avanza a la siguiente posición, con fseek regresas a la posición del valor leído y finalmente con fwrite lo sobrescribes con un menos uno.

Por ultimo la llamada a función:
Código
  1. fseek(arch,0,SEEK_CUR);
Es inútil porque indica que a partir de la posición actual (indicada por SEEK_CUR) se desplace ... cero bytes (segundo argumento).

Un saludo
104  Programación / Programación C/C++ / Re: Duplicar un archivo de texto plano con lenguaje C. en: 4 Marzo 2015, 16:41 pm
¿es correcto poner el cierre del archivo dentro del while()? ¿ o tengo que cerrarlo con el condicional if?
El programa tal como esta funciona correctamente:
A) Si la apertura del archivo falla no es necesario cerrarlo.
B) Si la apertura del archivo es exitosa este se cierra después del bucle while.

Un detalle es la especificación de rangos en la forma "a-z" ya que estos dependen del compilador utilizado, otro mas es la falta de validaciones mas el uso de feof para controlar el bucle. Para el caso es mejor:
Código
  1. if ( ptrBdd == NULL) {
  2.   perror("datos.txt");
  3. }else {
  4.   while (fscanf(ptrBdd, " %[^:]:%d:%s", campoUno, &campoDos, campoTres) == 3)
  5.      printf( "%s %d %s\n", campoUno, campoDos, campoTres);
  6.   fclose (ptrBdd);
  7. }

Un saludo
105  Programación / Programación C/C++ / Re: Duplicar un archivo de texto plano con lenguaje C. en: 4 Marzo 2015, 03:00 am
alguien me puede decir si esta es una manera correcta de duplicar un archivo
El programa debe funcionar correctamente, solo un detalle: si alguna de las aperturas de archivo falla terminaras llamando a la función fclose con su argumento igual a NULL y eso no lo define el lenguaje (comportamiento no definido).

Para solucionarlo antes de llamar a fclose verifica el valor de su argumento mediante una sentencia condicional:
Código
  1. if (ptrOrigen != NULL)
  2.   fclose (ptrOrigen);
  3. if (ptrCopia != NULL)
  4.   fclose (ptrCopia);

Un saludo
106  Programación / Programación C/C++ / Re: leer desde archivo en c en: 27 Febrero 2015, 02:44 am
hay alguna forma de guardar en primer lugar siempre un numero? me explico, guardar un numero y despues al guardar otro se ponga el primero, no a continuacion del primero
Depende de la forma en que abras el archivo y guardes los datos en el, algo que debes explicar a detalle.

A grandes rasgos es posible en dos escenarios, si se trata de un archivo:
A) de texto plano y el numero en realidad es un dígito (o bien se imprimió indicando una anchura de campo suficiente para el valor máximo del tipo).
B) binario (apertura en modo "b" y escritura con fwrite).

En ambos casos basta con abrir el archivo en modo "r+" (mas "b" dependiendo del caso), colocarse al principio del archivo con fseek y por ultimo utilizar la misma función para escribir los datos en el.

Un saludo
107  Programación / Programación C/C++ / Re: Lectura de Línea a Línea de un archivo de números enteros en C++ en: 25 Febrero 2015, 02:36 am
Formas para extraer los números de la linea de texto hay varias, por ejemplo utilizando un objeto de la clase istringstream para tratar la linea como un stream:
Código
  1. #include <sstream>
  2. using std::istringstream;
  3.  
  4. // ...
  5.  
  6. string linea = "1 2 3 4";
  7. int num;
  8.  
  9. // ...
  10.  
  11. istringstream in(linea);
  12. while (in >> num)
  13.   cout << num << endl;

Un saludo
108  Programación / Programación C/C++ / Re: el 3er do-while me esta marcando overflow porfa ayuda en: 24 Febrero 2015, 17:28 pm
segundo error.... todos (o casi todos) tus scanf están mal declarados...
Código
  1. scanf(" %c", &tipo);
espera literalmente lo que está ahí... que escribas un espacio y luego una letra... sin embargo lo agarra bien, aunque debes quitarle los espacios
No es un error sino un forma común de utilizar esa función. Explico:

scanf con todos los especificadores de formato (excepto dos) lo primero que hace es descartar el espacio blanco (espacio, tabulador, etc.), solo entonces consume los caracteres validos para la conversión indicada. Por ejemplo si tratamos de leer un entero y una palabra con "%d%s" una entrada como esta funcionara correctamente:
Código:
      123


fulano

Las dos excepciones son "%c" y "%[]", con estas el descarte no sucede (la función se "traga" los caracteres que pueda), por ejemplo si tratamos de leer un entero y un carácter con "%d%c" la siguiente entrada no dará el resultado esperado:
Código:
123{ENTER}
x{ENTER}
Ello porque la función consumirá los caracteres '1', '2' y '3' para generar el entero 123 y el avance de linea que sigue sera almacenado en la dirección indicada.

Para evitarlo se suele utilizar un espacio antes del especificador "%c" ya que este (el espacio) se interpreta como "descartar todo carácter para el cual la función isspace resulte en verdadero".

Por ultimo con la bendita función los caracteres de espacio blanco no se toman literalmente, en su lugar cualquier secuencia de estos se interpreta de la forma indicada (lectura y descarte de espacio blanco).

Un saludo
109  Programación / Programación C/C++ / Re: Menu string en: 24 Febrero 2015, 04:43 am
tengo una duda a la hora de hacer un menú que devuelva la opción elegida por el usuario: el problema es que tengo que hacer un do-while para que vaya verificando si la opción es correcta y hay opciones numéricas (1,2,3,etc) y una letra(q-para salir-).
Solo tienes que leer la opción como un carácter, continuación realizas la operación correspondiente de acuerdo con el enunciado de tu programa, mas o menos así:
Código
  1. #include <iostream>
  2. using std::cin;
  3. using std::cout;
  4. using std::endl;
  5.  
  6. int main()
  7. {
  8.   char opcion;
  9.   bool salir;
  10.  
  11.   salir = false;
  12.   do {
  13.      cin >> opcion;
  14.  
  15.      switch (opcion){
  16.      case '0':
  17.         cout << "La opcion es 0" << endl;
  18.         break;
  19.      case '1':
  20.         cout << "La opcion es 1" << endl;
  21.         break;
  22.      case '2':
  23.         cout << "La opcion es 2" << endl;
  24.         break;
  25.      case 'q':
  26.         cout << "La opcion es q" << endl;
  27.         salir = true;
  28.         break;
  29.      default:
  30.         cout << "Opcion no valida" << endl;
  31.         break;
  32.      }
  33.   }while (!salir);
  34.  
  35.   return 0;
  36. }

Un saludo
110  Programación / Programación C/C++ / Re: Empacar dos caracteres en una variable entera unsigned. [C] en: 24 Febrero 2015, 04:16 am
¿me podrías decir si mi programa tiene que ver con el enunciado?
Tu programa realiza la operación indicada de forma correcta, solo una recomendación: no utilices la función printf para imprimir una cadena vacía. En su lugar puedes utilizar un condicional para imprimir el espacio o bien ya que se trata de imprimir un solo carácter puedes usar la función putchar y el operador condicional, de esta forma:
Código
  1. while (bits){
  2.   putchar(v & bits ? '1' : '0');
  3.   bits >>= 1;
  4.  
  5.   sep++;
  6.   if (sep % CHAR_BIT == 0)
  7.      putchar(sep == sizeof(unsigned) * CHAR_BIT ? '\n' : ' ');
  8. }

Un saludo
Páginas: 1 2 3 4 5 6 7 8 9 10 [11] 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 ... 160
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines