Programación General > C/C++
Problema con programa
patosi:
Buenas necesito que me ayudeis con un programa en C. El programa tiene que almacenar un texto en un fichero y luego pedirle al usuario cuantas lineas visualizar de este texto y mostralo.
El programa me crea el fichero pero dentro me escribe muchos simbolos raros en vez del programa y a la hora de pedir las lineas, el usuario las introduce y no muestra nada. Os dejo el codigo haber si me podeis hechar una mano.
#include <stdio.h>
#include <conio.h>
#include <string.h>
#define MAXFILAS 22
#define MAXCOLUMNAS 80
void IniciarMatriz ( char matriz [MAXFILAS] [MAXCOLUMNAS]);
void Leer (FILE *fichero);
void Escribir (FILE *fichero, char matriz [MAXFILAS] [MAXCOLUMNAS]);
int main ( )
{
FILE *libro=NULL;
int final = 0 ;
char texto [ MAXFILAS ] [ MAXCOLUMNAS ];
while (final != 0 )
IniciarMatriz(texto);
Escribir(libro,texto);
Leer(libro);
return 0;
}
/* Funcion que inicia la matriz la cual contiene el texto elegido del libro. */
void IniciarMatriz (char texto [ MAXFILAS ] [ MAXCOLUMNAS ] )
{
strcpy(texto[ 0 ], " Todas las concepciones de la Iglesia son reconocidas por lo que son, como la más triste acuñación de moneda ");
strcpy(texto[ 1 ], " falsa que ha existido hecha con el fin de desvalorizar la Naturaleza y los valores naturales: ");
strcpy(texto[ 2 ], " el sacerdote mismo es reconocido como lo que es, como la más peligrosa especie de parásito ");
strcpy(texto[ 3 ], " como la verdadera araña venenosa de la vida... Nosotros sabemos, nuestra conciencia sabe hoy, ");
strcpy(texto[ 4 ], " qué valen en general aquellas funestas ínvenciones de los sacerdotes y de la iglesia, de qué servirán, ");
strcpy(texto[ 5 ], " esto es, para conseguir aquel estado de damnificación de la humanidad, cuyo espectáculo produce náuseas, ");
strcpy(texto[ 6 ], " los conceptos de más allá, juicio final, inmortalidad del alma, el alma misma, sin instrumentos de tortura ");
strcpy(texto[ 7 ], " y sistemas de crueldad, en virtud de los cuales el sacerdote se hizo el amo y siguió siendo el amo "),
strcpy(texto[ 8 ], " Todos saben esto, y sin embargo todo sigue igual. Donde ha ido a parar el último sentimiento del decoro ");
strcpy(texto[ 9 ], " del respeto de si mismo, si hasta nuestros hombres de Estado – por lo demás, una especie de hombres y ");
strcpy(texto[ 10 ], " de anticristianos bastante descocada en la práctica – se llamean aun hoy cristianos y toman la comunión? ");
strcpy(texto[ 11 ], " Toda práctica de cada momento, todo instinto, toda valoración que se convierte en hecho es hoy ");
strcpy(texto[ 12 ], " anticristiana;¿qué aborto de falsedad debe ser el hombre moderno para no avergonzarse todavía de llamarse cristiano! ");
strcpy(texto[ 13 ], " Ya la palabra cristiano es un equivoco: en el fondo no hubo más que un cristiano, y éste murió en la cruz. ");
strcpy(texto[ 14 ], " El Evangelio murió en la cruz. Lo que a partir de aquel momento se llamó evangelio era lo contrario de lo que ");
strcpy(texto[ 15 ], " él vivió; una mala nueva, un Dysangelium. Es falso hasta el absurdo ver la característica del cristiano ");
strcpy(texto[ 16 ], " en una fe, por ejemplo, en la fe de le redención por medio de Cristo; únicamente la práctica cristiana, el vivir ");
strcpy(texto[ 17 ], " como vivió el que murió en la cruz es lo cristiano... Aun hoy, tal vida es posible para ciertos hombres, ");
strcpy(texto[ 18 ], " y hasta necesaria: el verdadero, el originario cristianismo será posible en todos los tiempos. ");
strcpy(texto[ 19 ], " Yo llamo al cristianismo la única gran maldición, la única gran corrupción interior, el único gran instinto de venganza, ");
strcpy(texto[ 20 ], " yo la llamo la única inmortal vergüenza de la humanidad. ");
}
/* Función que escribe y almacena en el fichero el contenido del texto. */
void Escribir (FILE *fichero, char texto [ MAXFILAS ] [ MAXCOLUMNAS ])
{
int i;
int j;
if ((fichero = fopen("texto.txt", "w"))== NULL)
{
printf ( "n Error al crear el fichero n");
}
else
{
for (i = 0; i < MAXFILAS; i++)
{
for (j = 0; j < MAXCOLUMNAS; j++)
{
fprintf( fichero, "%c", texto [ i ][ j ] );
}
}
}
}
/* Función que lee el contenido almacenado en el texto, pide las lineas que el usuario desea ver y las imprime. */
void Leer (FILE *fichero)
{
int i;
int lineas;
int j;
char caracter;
if ((fichero = fopen("texto.txt", "r"))== NULL)
{
printf ( "n Error al crear el fichero n");
}
else
{
do {
printf("nIntroduzca numero de lineas que desea visualizar: ('Pulse 0 para salir') n ");
scanf ("%d",&lineas);
fflush(stdin);
for (i = 0; i < lineas; i++)
{
for (j = 0; j < MAXCOLUMNAS; j++)
{
fscanf(fichero , "%c", &caracter);
printf("%c", caracter);
}
}
} while (lineas!=0);
fclose ( fichero );
}
}
ProfesorX:
Hola patosi, prmero que nada un consejo, cuando publiques codigo, utiliza las etiquetas [ code][ /code] (sin espacio en los corchetes) para encerrar tu codigo, eso hace que sea mas legible.
Ahora revisando tu programa, diria que tienes dos errrores basicos, el primero esta en esta parte:
--- Código: C++ --- while (final != 0 ) IniciarMatriz(texto);
En esta parte tienes un ciclo while que se ejecuta solo si la variable "final" no es igual a cero, pero como arriba la inicializas con un valor a cero, entonces la condicion del ciclo es falsa, por lo que nunca entra al ciclo while, y al no entrar, nunca inicializa la matriz, entonces la matriz contendra basura, y al guardarla en el archivo guardara basura, es por eso que obtienes "simbolos extraños". Ademas ese ciclo no lo necesitas (en mi opinion) para nada, asi que simplemente borra la linea del while y deja la linea de IniciarMatriz(texto);
El otro error es que en la funcion escribir nunca cierras el archivo, asi que simplemente agrega un fclose(fichero); despues de que hayas terminado de escribir la matriz para cerrar el archivo.
Bueno eso es lo que encontre a simple vista.
Saludos y suerte :)
patosi:
Gracias por contestar.
El problema esque el problema es que el programa tiene que repetirse hasta que el usuario quiera, por eso necesito el while. Lo de los simbolos extraños era por lo que me comentaste pero ahora hay otro problema; El programa tiene que mostrar el texto nada mas comenzar el programa y no lo hace y otro problema es a la hora de decir quiero que muestre X lineas las muestra pero sin respetar los saltos de linea que yo he definido en el codigo..
Haber si me podeis ayudar. Gracias un saludo.
ProfesorX:
--- Cita de: "patosi" --- El problema esque el problema es que el programa tiene que repetirse hasta que el usuario quiera, por eso necesito el while.
--- Fin de la cita ---
Entonces estas definiendo mal el while, y probablemente necesitarias un do..while en lugar de un while, algo como:
--- Código: C++ --- char final; do { Leer(libro); printf("Terminr programa (s/n)n"); final = getchar(); } while (final != 's');
--- Citar ---El programa tiene que mostrar el texto nada mas comenzar el programa y no lo hace
--- Fin de la cita ---
Esto es porque no lo estas haciendo, deberias de añadir codigo para mostrar todo el texto, justo despues de IniciarMatriz(texto) y antes de Escribir(libro,texto), seria una funcion adicional a void Leer (FILE *fichero) pero que te muestre el texto en la pantalla antes de escribir en el archivo.
--- Citar --- y otro problema es a la hora de decir quiero que muestre X lineas las muestra pero sin respetar los saltos de linea que yo he definido en el codigo..
--- Fin de la cita ---
Pues dejame decirte que en tu programa NUNCA defines saltos de linea, el hecho de que separas las lineas de texto de tu matriz, no significa que se separan por arte de magia, debes añadir manualmente los saltos de linea.
Ademas descubri otros problemas con tu codigo:
Uno es que estas escribiendo las lineas de manera incorrecta en tu programa, tu estas escribiendo caracter por caracter, cuando deberias hacerlo linea por linea. Si te pidieron que escribieras caracter por caracter, tendrias que agregar una verificacion adicional para cuando llegues al final de la cadena, insertar el salto de linea y leer la siguiente cadena. Si no es asi, y te permiten escribir lineas enteras, entonces reemplaza el siguiente codigo:
--- Código: C++ --- for (i = 0; i < MAXFILAS; i++) { for (j = 0; j < MAXCOLUMNAS; j++) { fprintf( fichero, "%c", texto [ i ][ j ] ); } }
Por este que escribe lineas enteras, con su salto de linea n
--- Código: C++ --- for (i = 0; i < MAXFILAS; i++) { fprintf( fichero, "%sn", texto [ i ]); }
El otro problema es que no estas definiendo suficiente espacio para tus cadenas, tu usas #define MAXCOLUMNAS 80, como si tus lineas tuvieran 80 caracteres de longitud, y en la realidad la mas larga mide 125 caracteres de longitud, entonces deberias hacer una de 2 cosas:
1. recortar tu cadenas de manera que no pasen de 79 caracteres (hay que guardar un espacio para el fin de cadena '')
o 2. cambiar tu MAXCOLUMNAS a un valor mas grande, diria que 130, para que te cupiera toda la linea completa.
Bueno, creo que tienes bastante trabajo que hacer y corregir, espero que te sirva la ayuda y manos a la obra.
Saludos :)
patosi:
Gracias por la ayuda, he modificado lo que me has comentado y ya esta todo perfecto, solo hay 2 detalles: he contado los caracteres de una linea y son 72, pero al poner maxfilas en 72, al final del texto de deja un espacio como de 10 o 15 filas y si le pongo menos de 72 no me deja el espacio al final del programa pero se me descuadran 2 lineas.. Otro fallo es a la hora de pedir las lineas a mostrar, muestra las que pido pero la ultima que se muestra se muestra a la mitad...
Un saludo.
Navegación
[#] Página Siguiente
Ir a la versión completa