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

#1051
Programación C/C++ / Re: Duda sobre ficheros
6 Diciembre 2012, 15:39 PM
Cita de: asdavid en  6 Diciembre 2012, 14:53 PMcomo leo el salto de linea en un fichero??
El nombre del tipo esta mal, debería ser "FILE". También hay que cambiar la definición de la función main y evitar el uso de la biblioteca conio de Borland. Mas información en el tema |Lo que no hay que hacer en C/C++. Nivel basico|.

Para leer todas las lineas de un archivo utilizas la función fgets en un bucle, este termina cuando ella retorne NULL (eso sucede en caso de error o fin de archivo). Mas o menos así:
#define NUM_CHARS     256
#define NOM_ARCHIVO  "Fichero.txt"

/* ... */

FILE *entrada;
char linea[NUM_CHARS];
int i;

/* ... */

i = 0;
while (fgets(linea, NUM_CHARS, entrada) != NULL){
   printf("Linea %d: %s\n", ++i, linea);
   /* etc */
}
if (ferror(entrada)){
   /* Manejo de error */
   perror(NOM_ARCHIVO);
   /* etc */
}


Cita de: leosansan en  6 Diciembre 2012, 15:35 PMUn ejemplo es el código que te paso.
Se debe evitar el uso de la funcion feof para controlar la lectura de un archivo, te comente las razones de ello en otro tema.

Un saludo
#1052
Comentarios sobre el programa:

* Cuando verifiques la apertura de un archivo si esta falla utiliza la función perror para generar el mensaje de error y si no estas seguro del valor de retorno utiliza EXIT_FAILURE (macro definida en <stdio.h>):
if ((fichero = fopen(NOM_ARCHIVO, "rt")) == NULL){
   perror(NOM_ARCHIVO);
   return EXIT_FAILURE;
}


* No utilices la función feof para controlar la lectura de datos en un bucle ya que esa función retorna verdadero (diferente de cero) solo después que una función de lectura falla. En su lugar utiliza directamente el valor de retorno de la función fgets:
while (fgets(linea, 81, fichero) != NULL){
   /* ... */
}


* La sentencia "continue;" no es necesaria, en su lugar:
for (j = 0; linea[j] != '\0'; j++)
   if (linea[j] != 't' || linea[j + 1] != 'r')
      linea1[i][k++] = linea[j];


Por ultimo considerando que no haces nada con la cadena modificada puedes eliminar ese paso (almacenamiento) e imprimir directamente cada carácter mediante la función putchar.

Un saludo
#1053
naderST y durasno ya te dieron la respuesta: en las dos funciones de tu primer mensaje (getPos y mntPagoClt) cierras el archivo y retornas un valor solo si encuentras el registro buscado, si no existe eso resulta (eventualmente) en el mensaje de error "Too many open files".

Aparte de eso utilizas el operador "&" cuando deberías utilizar "&&", hay que revisar la documentación de SDL ya que este bloque es extremadamente largo:
if(event.key.keysym.sym==SDLK_a&EVENTOCLICK)
{
    SDL_printf(sig, sig_y, "a", 10, ROJO);
    save_array(active_texbox,cant,'a');
    cant++;
    sig+=10;
    }
else if(event.key.keysym.sym==SDLK_b&EVENTOCLICK)
{
    SDL_printf(sig, sig_y, "b", 10, ROJO);
    save_array(active_texbox,cant,'b');
    cant++;
    sig+=10;
    }
else if(event.key.keysym.sym==SDLK_c&EVENTOCLICK)
{
    SDL_printf(sig, sig_y, "c", 10, ROJO);
    save_array(active_texbox,cant,'c');
    cant++;
    sig+=10;
    }

/* ... */


Por ultimo tienes otro error lógico en las funciones de posicionamiento en el archivo:
int getPos(char *cedulaPago)
{
   FILE *dato = fopen("fixcom.fix", "rb");
   int pos=0;
   
   //fseek(dato, 0L, SEEK_SET);
   verificarFichero(dato,"dato");
   
   while(fread(&usuario, sizeof(struct user), 1, dato)!=0){
      pos++;
      if(strcmp(cedulaPago, usuario.cedula)==0){
         fclose(dato);
         return pos;
      }
   }
}

void getPosFich(int pos, FILE *filePtr)
{
   fseek(filePtr, pos*sizeof(struct user), SEEK_SET);
}

El problema: si el registro buscado es el primero el desplazamiento desde el inicio del archivo (indicado por SEEK_SET) debe ser cero mientras que tu indicas que es uno, mismo caso con cualquier otro registro (debes utilizar indices de posición similares al uso de un array: 0 .. N-1).

Un saludo
#1054
Programación C/C++ / Re: problema cout's
4 Diciembre 2012, 17:15 PM
En el caso de los contadores de los bucles se debe tratar, en lo posible, de que estos almacenen un valor útil, por ejemplo el numero de elementos leídos y almacenados.

Es mejor leer el numero en una variable auxiliar y almacenarlo en el array solo si es distinto de -1:
Código (cpp) [Seleccionar]
int i;
int aux;

// ...

for (i = 0; cin >> aux && aux != -1; i++){
   numeroP[i] = aux;
   cout << numeroP[i] << endl;
}
// El numero de valores almacenados es i


Un saludo
#1055
Cita de: NathanD en  3 Diciembre 2012, 21:56 PMmi duda es la siguiente: qué forma hay de trabajar con cadenas de caracteres de una forma segura con las funciones scanf() y/o gets()?
No se debe utilizar la función gets porque no hay forma de limitar los caracteres que esta lee y almacena en el array indicado.

En su lugar se pueden utilizar fgets y scanf, como indicar la capacidad del contenedor en el caso de la primera y el numero máximo de caracteres a almacenar en el caso de la segunda se indica en el tema Duda con puntero a arreglo de caracteres.

Un saludo
#1056
Como procesar cada linea del archivo de entrada ya lo explico durasno: se obtiene cada una con fgets y se verifica la existencia de la cadena con strstr.

Para actualizar el archivo una forma sencilla es:

1) Se abre el archivo de entrada (el original) y uno temporal, para generar su nombre se puede utilizar la función tmpnam.

2) Se procesa cada linea del modo indicado y la linea modificada se envía al archivo de salida (el archivo temporal).

3) Una vez procesada cada linea se cierran los archivos, se elimina el archivo original con la función remove y se renombra el archivo temporal (dándole el nombre del archivo original) con la función rename.

Los prototipos de todas esas funciones se encuentran en el encabezado <stdio.h> con la excepción de strstr (para ella es <string.h>).

Un saludo
#1057
Programación C/C++ / Re: Comparar palabras en C
4 Diciembre 2012, 15:45 PM
Cita de: routers en C! en  3 Diciembre 2012, 21:09 PM
el problema es muy tonto y en C pero llevo toda la tarde.

Me piden un numero n y n palabras.
Tengo que utilizar un vector de tiras de caracteres.
El programa acaba diciéndome que palabra se repite mas.
Los pasos para realizar la operación, en lo general, son:

1) Almacenas cada palabra en un array de arrays de caracteres.
2) Ordenas las cadenas utilizando, por ejemplo, la función qsort parte de la biblioteca estándar de C (prototipo en <stdlib.h>).
3) Con el paso 2 los repetidos ya están agrupados, ahora solo debes comparar cada cadena con la anterior: si son distintas es un nuevo grupo, si son iguales incrementas el contador y comparas contra el máximo.

No es difícil, es eficiente y, mejor todavía, un buen ejercicio.

Un saludo
#1058
@leosansan: el programa que publico es un ejemplo tomado del libro K&R2, por favor no hagas su tarea (esta en las reglas).

Un saludo
#1059
Programación C/C++ / Re: suma de matrices
3 Diciembre 2012, 02:13 AM
El error principal ya lo comento durasno: utilizar en los bucles el operador "<=" cuando debería ser "<".

Ello porque cuando declaras un array:
Código (cpp) [Seleccionar]
int num[N];
Se indica el numero de elementos N y se accede a estos mediante los indices 0 .. N-1.

Como declaras un array de un elemento que a su vez es un array de un elemento de tipo int:
Código (cpp) [Seleccionar]
int matriz[1][1];
El único indice valido al acceder a ese array es cero, mismo caso con los otros dos arrays.

Un saludo
#1060
Programación C/C++ / Re: Programa con cadenas
2 Diciembre 2012, 18:54 PM
Lo primero que debe hacer es cambiar la definición de la función "main" y evitar el uso de "gets", por favor lee el tema |Lo que no hay que hacer en C/C++. Nivel basico|.

El error principal en tu programa son las llamadas a la función cambio y strcat (esta ultima innecesaria):
cambio(destino[TAM],original[TAM]);
Solo debes utilizar los nombres de los arrays, de esta forma:
cambio(destino, original);

Y la función que invierte la cadena esta mal implementada, debería ser mas o menos así:
void reverse(char *dst, char const *src)
{
   int i;
   
   /* Encontramos el final de la cadena original */
   for (i = 0; src[i] != '\0'; i++)
      ;
   
   /* Almacenamos el indicador de fin de cadena */
   dst[i] = '\0';
   
   /* Copiamos los demas caracteres */
   while (i-- > 0)
      *dst++ = src[i];
}

Funciona pero con una limitante importante: no verifica la capacidad de los contenedores (arrays), si la cadena original sobrepasa la capacidad del array de destino el programa ...

Un saludo