Problema en ejercicio de ficheros

Iniciado por DickGumshoe, 4 Febrero 2012, 21:33 PM

0 Miembros y 1 Visitante están viendo este tema.

DickGumshoe

Hola.

Estoy empezando con el tema de ficheros.

Tengo este ejercicio:

/*Un programa que pregunte un nombre de fichero y muestre en pantalla el contenido de
ese fichero, haciendo una pausa después de cada 25 líneas, para que dé tiempo a
leerlo. Cuando el usuario pulse intro, se mostrarán las siguientes 25 líneas, y así hasta
que termine el fichero.*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int main()
{
    FILE* fichero;
    char nombre[50];
    char linea[81];
    char pausar[2];
    int i;
   
    printf("Introduce un nombre");
    fgets(nombre,49,stdin);
    i=0;
fichero = fopen(nombre, "rt");
if (fichero == NULL)
{
printf("No existe el fichero!\n");
exit(1);
}
while (! feof(fichero)) {
                i=i+25;
fgets(linea, i, fichero);
puts(linea);
do{
gets(pausar);
}
while(strcmp(pausar,"")!=0);           

}

fclose(fichero);
   
    system("pause");
    return 0;
}


Pero tengo varias cosas mal:

- Siempre me dice que el fichero no existe.
- No consigo que pare cada 25 líneas hasta que presione intro sin escribir nada (lo que he conseguido ha sido cada X letras...).

Muchas gracias.

Saludos.

DickGumshoe

Vale, he solucionado uno de los problemas. Ya me reconoce cuándo existe y cuándo no un archivo. Lo que he hecho ha sido sustituir fgets por gets.

Pero todavía me queda la otra parte del problema.

Gracias.

Saludos.

eleon

Para pausar hasta que le de a intro te basta con poner un "scanf()" al final del bucle.

Saludos.

DickGumshoe

Gracias por contestar.

Eso lo tengo, aunque de otra forma (comparando "pausar" con "").

Lo que me falta es que cada 25 líneas pare, que no sé cómo podría hacerlo...

eleon

#4
Con un contador. Si cada vez que se ejecuta el bucle se imprime una línea, debes llevar un contador que calcule el número de lineas impresas y al llegar a 25 con un condicional te pida presionar {ENTER}. Ejemplo:


short unsigned int contador = 0;
while (condicion)
{
//Instrucciones para imprimir la línea
contador += 1;

if (contador == 25)
{
scanf ("");
contador = 0; //Lo reiniciamos para que vuelva a contar 25 líneas
}


Y en esta parte:

do{
gets(pausar);
}
while(strcmp(pausar,"")!=0);


No es correcto el uso de gets, es aconsejable cambiarlo por scanf. Si has declarado la cadena "pausar" con 2 elementos, el usuario puede perfectamente introducir "sidhashi {ENTER}" y gets lo recoge todo almacenándolo en zonas de memoria consecutivas y arriesgándote a que sobreescriba sobre otros datos en uso.

Saludos.

DickGumshoe

Muchísimas gracias.

Ya he entendido cómo se hace.

Saludos.