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 - MAFUS

#741
Programación C/C++ / Re: Buscador (C)
20 Mayo 2017, 19:29 PM
Sobre esa parte que comentas. Si encuentras un error en la apertura del archivo debes detener el programa para que no siga actuando sobre ese archivo, sin embargo solo marcas el error pero dejas al programa que continúe.
#742
Si es así:
1. Consigue las tres palabras a buscar
2. Consigue el número para modificar
3. Abre el archivo para lectura/escritura
4. Lee una frase del archivo a una cadena
5. Mientras no hayas llegado al final del archivo
5.1. Consigue la primera palabra de la cadena
5.2. Consigue la segunda palabra de la cadena
5.3. Consigue la tercera palabra de la cadena
5.4. Compara las palabras conseguidas con las que has conseguido del usuario
5.4.1. Si todas se corresponden regresa al archivo tantos bytes como de largo es la frase que leíste
5.4.2. Escribe una nueva frase como lo haces en NuevaFila() pero en vez del 0 incluyes el número que te ha dado el usuario
5.5. Lees una nueva frase del archivo
6. Cierra el archivo
#743
Una forma muy fácil de dibujar caracteres por pantalla es hacer una tabla de caracteres con cada uno de los caracteres. Por ejemplo:


char caracter_a[8][9] = {
    "        ",
    "        ",
    " XXXX   ",
    "    XX  ",
    " XXXXX  ",
    "XX  XX  ",
    " XXX XX ",
    "        "};


Una vez que tengas todas los caracteres ya solo debes crear una función que los imprima.

El carácter lo he sacado del manual del amstrad CPC 464, sección 'Conjunto de caracteres gráficos específicos de la máquina'
#744
He estado mirando esto y hay algunos errores de base.

El 0 es el número a modificar si alguna entrada posterior existe con otro número.
Tu función NuevaFila por defecto la crea con el 0, por tanto si no hay entradas iguales se queda con 0.

Esto llevará a:
Si aparece una entrada que ya exista y esta lleva 0 tendrá 0.
En un archivo nuevo desde este programa todas las líneas tendrán 0.

Por cierto, append, la "a" de fopen, hace que el archivo crezca por el final, no por el principio.
Deberías replantear de nuevo el programa.
#745
El fuente con el error, para tener una base con la que partir.
#746
Busca info sobre la libreria ctype. Tiene funciones para saber si un caracter es alfabético, numérico, caracter en blanco, imprimible....

Tu algoritmo para consonantes es muy engorroso. Bastaría con que usaras isalpha para saber si es una letra y no es a e i o u.

De igual forma tu algoritmo para los números està mal. Tu buscas la representación de los números, no los valores del 0 al 9. Recuerda que el valor decimal 0 indica el fin de cadena.
#747
Sí, de hecho esto es la base de la programación modular. Es lo mismo que te han enseñado para las clases pero sin encerrar las funciones dentro de una clase.
Por una parte creas el archivo de cabecera con las declaraciones de las funciones y por otra un archivo de implementación que llevará las definiciones. En éste último harás include del primero.
Compilas el archivo para crear un archivo objeto, librería estática o librería dinámica.
En el programa cliente incluyes la cabecera y a la hora de enlazar para generar el ejecutable o librería debes indicar al enlazador que debe usar el archivo objeto, librería estática o librería dinámica que has compilado con anterioridad.


Ejemplo:
Cabecera: suma.h
#ifndef SUMA_H
#define SUMA_H

int suma(int a, int b, int c);

#endif


Implementación: suma.c
#include "suma.h"

int suma(int a, int b, int c) {
   return a + b + c;
}


Ahora en gcc se genera el archivo objeto suma.o:
Código (bash) [Seleccionar]
gcc -c suma.c

Programa cliente: programa.c
#include <stdio.h>
#include "suma.h"

int main() {
   printf("%d\n", suma(1, 2, 3));
}


Ahora en gcc se compila el programa entero.
Código (bash) [Seleccionar]
gcc programa.c suma.o -o programa

En el archivo de cabecera se pueden ver las guardas con hechas con directivas de preprocesador. Esto es para que no se incluya más de una vez la misma cabecera, cosa que crearía conflictos.
#748
Por lo que entiendo es un array de cadenas y se comprueba que la cadena introducida es diferente a la anterior y a la siguiente (si la hubiera). Y si la cadena introducida son todos ceros no se incrementa un contador.
#749
Vale, tienes un pequeño problema pero es muy engorroso. No es difícil de arreglar, pero sí que conlleva escribir bastante código y a estructuras más grandes más código a escribir.

Verás. Se llama memory padding, en español acomodación de la memoria. ¿De qué se trata?

C, y por extensión C++, vienen de un tiempo donde la memoria era algo precioso (escasa y cara) y los procesadores eran muy lentos por lo que el lenguaje mismo ayudaba a que los datos, estructuras, ocuparan lo mínimo posible pero al mismo tiempo que el acceso a sus datos fuera lo más rápido posible. Así que acomodaba los datos, no en el orden que había dictado el programador, sino que hacía que quedaran múltiplos al tamaño de palabra del procesador y con el menor número de huecos posibles. Ya, suena complicado, para entenderlo te invito a que profundices en manejo de memoria por parte de C.

¿En qué te afecta? Cuando tienes una estructura y la quieres copiar toda de una vez en un archivo C, y por extensión C++, copiará literalmente esa porción de memoria en el archivo y lo hará todo lo desordenada (para él ordenada) que sea, así que los campos en el disco no están como esperas. De esta forma cuándo vayas a sacarlos y copiarlos de nuevo a una estructura copiará tal cual del disco y lo situará en la porción de memoria que tienes byte a byte. Un desastre.

¿Qué puedes hacer? Existen extensiones del compilador, y por tanto no es portable el código, que aseguran que en memoria los datos van a estar tal cual lo has escrito en el código.
O
Una forma más portable, es copiar uno a uno los campos de la estructura en el disco y, a la hora de leerlos, adquirirlos uno a uno llenando así la estructura destino.
#750
Y una copia del archivo, sino no podemos probar.


Ahora que me fijo: buscas datos binarios en el archivo pero lo abres para texto, por eso tienes problemas a la hora de conseguir datos.