Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - rir3760

#701
Cita de: m@o_614 en 12 Septiembre 2013, 01:58 AMpor que antes del fread siempre se tiene que utilizar el ftell?
Porque no sabemos de antemano si el carácter que vamos a leer cumplirá o no con la condición, si es igual a '1' debemos regresar a la posición anterior (ftell + fseek) y sobrescribir ese carácter (fwrite).

Un saludo
#702
Otro error se debe al "Copy & Paste", en la llamada a getch para pedir confirmación sobre continuar o no:
printf("Quieres introducir otro producto (s/n)?\n");
getch("%c", &otroProducto);

Deberia ser una llamada (mas) a scanf:
printf("Quieres introducir otro producto (s/n)?\n");
scanf(" %c", &otroProducto);

Se debe utilizar " %c" (un espacio antes del carácter '%') para evitar problemas con el espacio blanco al final de la linea anterior.

Un saludo
#703
Cita de: m@o_614 en 10 Septiembre 2013, 23:30 PMle habia hecho al codigo unos cambio de los que me habian dicho, pero ahora sucede que aunque el programa si cambia los 1's por los 5's ahora se cicla infinitamente
El problema se debe a que en los modos de actualización ("r+", "w+" y "a+") las operaciones de lectura y escritura no pueden realizarse una inmediatamente después de la otra. Siempre después de una operación de lectura se debe indicar la posición en el archivo mediante fseek o rewind si la intención es continuar con una operación de escritura (y al revés): lectura <==> posicionamiento <==> escritura.

En tu caso eso no sucede porque si el carácter '1' se encuentra en el archivo lo sobrescribes con un '5' y a continuación (en la siguiente iteración del bucle) tratas de leer el siguiente carácter, ahí falta la mentada llamada a función.

Para que el programa funcione correctamente se puede utilizar la función ftell para obtener las posiciones antes y después de la lectura del carácter:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   FILE *stream;
   long a;
   long b;
   char ch;

   if ((stream = fopen("Entrada.txt", "r+")) != NULL){
      while (a = ftell(stream), fread(&ch, 1, 1, stream) == 1){
         if (ch == '1'){
            b = ftell(stream);

            fseek(stream, a, SEEK_SET);
            ch = '5';
            fwrite(&ch, 1, 1, stream);
            fseek(stream, b, SEEK_SET);
         }
      }
     
      fclose(stream);
   }
   
   return 0;
}


Un saludo
#704
En la pagina que mencionas se explica porque no es necesaria la inclusión de ese encabezado, por ejemplo en la pagina sobre el operador new:
CitarThe default allocation and deallocation functions are special components of the standard library; They have the following unique properties:

* Global: All three versions of operator new are declared in the global namespace, not within the std namespace.

* Implicit: The allocating versions ((1) and (2)) are implicitly declared in every translation unit of a C++ program, no matter whether header <new> is included or not.

* Replaceable: The allocating versions ((1) and (2)) are also replaceable: A program may provide its own definition that replaces the one provided by default to produce the result described above, or can overload it for specific types.

Un saludo
#705
Otro error es utilizar la función feof para controlar el bucle (con ello se realiza una iteración de mas) y uno mas es el orden de los argumentos de la función fwrite:
fwrite(fd, sizeof(char), 1, letra);
El primer argumento debe ser la dirección base (de tipo "void *") y el ultimo el archivo a procesar (de tipo "FILE *").

Y no necesitas del encabezado <unistd.h>. Si no tienes una referencia sobre las funciones de la biblioteca estándar de C (C90) deberías conseguir una, mientras eso sucede una aceptable es Standard C.

Un saludo
#706
Cita de: m@o_614 en  7 Septiembre 2013, 03:10 AMTengo el siguiente codigo que lee el primer y último carácter de un archivo de texto y los muestra en pantalla.La prueba consiste en mostrar el primer y último carácter correctamente independientemente del tamaño del archivo.
En tu programa no es necesario incluir <unistd.h> y no deberías utilizar fseek ya que se trata de un archivo en modo texto.

Cita de: m@o_614 en  8 Septiembre 2013, 21:39 PMTenian razon,  no solo el ultimo caracter era un salto de linea o espacio, sino que los ultimos 4 caracteres tambien eran saltos de linea
Puedes verificar si el carácter se puede imprimir utilizando funciones como isprint (prototipo en <ctype.h>), mas o menos así:
int ch;

/* ... */

/* Si es imprimible y no es espacio blanco se imprime tal cual ... */
if (isprint(ch) && !isspace(ch))
   printf("%c\n", ch);
else /* ... caso contrario se imprime como una secuencia de escape (Base 16) */
   printf("\'\\x%02x\'\n", ch);


Un saludo
#707
Cita de: anajulia829 en  9 Septiembre 2013, 19:50 PMfor (i = 0; i < 20; i++){
   printf("Ingrese posicion %d de cedula: ",i);
   scanf(" %c", &cedula);
   vectorced[i] = cedula;
}

SUPUESTAMENTE ES UNA TONTERIA PERO NO LE ENCUENTRO SOLUCION, SI TENGO ESTE TROZO DE CODIGO, POR QUE AL EJECUTARLO ME APARECE ESTO
ingrese posicion 1 cedula: ingreso a y le doy enter
aparece
ingrese posicion 2: ingrese posicion 3 : ingreso b y le doy enter aparece...
ingrese posicion 4: ingrese posicion 5 : ingreso b y le doy enter aparece...
y asi etc etc

EN TOTAL INGRESO 10 VECES CARACTERES, SI LE DOY SOLAMENTE ENTER Y NO CARACTER MAS ENTER, EL CODIGO SE EJECUTA COMO QUIERO
Al llamar a scanf utilizas la cadena de formato " %c", con ella no hay problema y no puede presentarse el comportamiento que mencionas.

Tu problema fue que en algun momento cambiaste esa cadena de formato a "%c" eliminado el espacio antes del caracter '%'. Con esa cadena de formato la funcion leera el primer caracter que encuentre sin importar cual. Por ejemplo si tecleas:
a{ENTER}
La funcion procesa el caracter 'a' y retorna, en la segunda iteracion del bucle el caracter que se procesa es el avance de linea '\n' generado al presionar la tecla {ENTER} y que se encuentra en el bufer de la entrada estandar. Ello da, como describes, la apariencia de "saltarse una lectura".

Un saludo
#708
Cita de: Scene en  8 Septiembre 2013, 20:18 PMEsta clase hace que una palabra la convierta en leguaje ("f") (a cada vocal se le agrega ´f´ mas la misma vocal tiene todas las condiciones pero siempre sigue saliendo la misma palabra
Errores hay varios.

Como ya te comento Stereo no estas retornando la cadena correcta y en el bucle donde agregas las 'f's inicializas el contador "k" dentro del bucle cuando deberías hacerlo fuera de el.

Ademas no necesitas utilizar la función strlen, basta con procesar todos los caracteres antes del '\0' (el delimitador de cadena), en ambas ramas del condicional asignas el carácter procesado lo que resulta en una sentencia repetida y por ultimo una vez generes la cadena en "dest" (que es una variable temporal) la debes copiar en "cadena".

Esa función con los cambios:
Código (cpp) [Seleccionar]
void idiomaf()
{
   size_t i;
   size_t j;
   
   j = 0;
   for (i = 0; cadena[i] != '\0'; i++){
      if (cadena[i] == 'a' || cadena[i] == 'e' || cadena[i] == 'i' || cadena[i] == 'o' || cadena[i] == 'u')
         dest[j++] = 'f';
     
      dest[j++] = cadena[i];
   }
   dest[j] = '\0';
   
   strcpy(cadena, dest);
}


Un saludo
#709
Programación C/C++ / Re: EOF y archivos
5 Septiembre 2013, 02:58 AM
Cita de: m@o_614 en  4 Septiembre 2013, 21:29 PMel problema es que me imprime basura y creo que tiene que ver con que le puse EOF en el while para cuando se encuentre el fin de linea
Si no tienes una referencia de calidad deberías conseguir una.

El problema se encuentra en el bucle y se debe a que comparas el valor de retorno de fread (numero de elemento leídos, siempre igual o mayor que cero) con la constante EOF (algún valor negativo).

Debes cambiarlo a:
while (fread(buffer, 1, 1, fo) == 1)
   fwrite(buffer, 1, 1, fd);

Pero si vas a leer e imprimir carácter por carácter mejor utiliza las funciones fgetc y fputc.

Un saludo
#710
Programación C/C++ / Re: problemas con dev c++
2 Septiembre 2013, 03:37 AM
Lo primero que se debe cambiar es el nombre de los encabezados <stdio.h>, <string.h> y <ctype.h>, en C++ los nombres políticamente correctos son <cstdio>, <cstring> y <cctype>. También se debe evitar el uso de "fflush(stdin)" y gets. Por favor lee |Lo que no hay que hacer en C/C++. Nivel basico|.

Otro error sucede al presentarse el menú, este se debe colocar en un bucle que se repita hasta que el usuario seleccione la opción "Salir" mientras que tu lo tienes iterando un máximo de 15 veces.

Otro error es utilizar la variable "i" como indice de los registros ingresados cuando deberías utilizar la variable "cont".

El error mas importante se encuentra en el fragmento:
Código (cpp) [Seleccionar]
printf("\nIngresar Nombre:");
scanf("%c", &nom);
fflush(stdin);

printf("\nIngresar Apellido:");
scanf("%c", &ape);
fflush(stdin);

printf("\nIngresar fecha de nacimiento:");
gets(agenda[i].fecha);
fflush(stdin);

El problema ahí se debe al especificador utilizado: "%c" indica leer un solo carácter, para leer una palabra debes utilizar "%s".

Lo mejor en este caso es (en mi opinión, por supuesto) rescribir el programa desde cero teniendo a la mano un buen libro de C++. Puedes empezar quitando todas las funciones de C y manejando la entrada estándar con funciones como std::istream::getline.

Un saludo