Hola, intento hacer un programa que que abra un fichero si no existe lo cree y si no compruebe que tiene el formato correcto que seria:
:1:maria:
:2:marta:
:3:jorge:
si esta mal devuelve error y si esta bien muestra por pantalla lo que hay en el fichero.
El problema es que no funciona y no se muy bien porque, tenia hecho un programa que pedia que se introdujeran los datos y hacia lo mismo y lo modifique para que lo hiciera con ficheros pero no funciona
Gracias por la ayuda
:1:maria:
:2:marta:
:3:jorge:
si esta mal devuelve error y si esta bien muestra por pantalla lo que hay en el fichero.
El problema es que no funciona y no se muy bien porque, tenia hecho un programa que pedia que se introdujeran los datos y hacia lo mismo y lo modifique para que lo hiciera con ficheros pero no funciona
Gracias por la ayuda
Código [Seleccionar]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
// Un entero no negativo de 32 bits ocupa como máximo 10 caracteres
#define MAX_LON_NUMERO 2
// Sólo admitimos nombres de hasta 255 caracteres
#define MAX_LON_NOMBRE 50
// La lÃnea de entrada debe admitir los 10 del entero + 3 ':' +
// los 255 del nombre + los 3 ':' + 1 para el '\n'
#define MAX_LON_LINEA MAX_LON_NUMERO+3+MAX_LON_NOMBRE+1
int main () {
// en todas las cadenas reservamos espacio para el '\0'
char linea[MAX_LON_LINEA+1]; // La lÃnea tecleado por el usuario
char num[MAX_LON_NUMERO+1]; // El número en formato de cadena
int numero; // El número pasado a entero
char nombre[MAX_LON_NOMBRE+1]; // El nombre leÃdo
int correcto; // Control de errores
int i, j; // Ãndices
FILE *lectores;
lectores=fopen("lectores.txt","r");
if(lectores==NULL){
printf("no existe el fichero\n");
lectores=fopen("lectores.txt","w");
return 0;
}
else{
do {
correcto = 1;
fgets (linea, sizeof(linea), lectores);
// Si el último carácter leÃdo no es un '\n', es que el usuario ha
// tecleado una lÃnea demasiado larga => entrada no correcta
if (linea[strlen(linea)-1] != '\n') {
correcto = 0;
printf("demasiado larga\n");
// Extraemos (y descartamos) el resto de la lÃnea
while (fgetc(lectores) != '\n') ;
}
// El primer caracter y el anterior al '\n' deben ser ':'
// Si no => entrada no correcta
else if ((linea[0] != ':') || (linea[strlen(linea)-2] != ':')){
correcto = 0;
printf("no : no 1 e no ultimo\n");
}
else {
// Si lo anterior se cumple, ponemos un '\0' en lugar del ':' final
linea[strlen(linea)-2] = '\0';
// Extraemos los dÃgitos que haya después del ':' inicial
// Es decir, a partir del 2º caracter (Ãndice 1)
i = 1;
j = 0;
while ((isdigit(linea[i])) && (j < MAX_LON_NUMERO)) {
num[j++] = linea[i++];
}
// Si hemos extraÃdo 0 dÃgitos => entrada no correcta
if (j == 0){
correcto = 0;
printf("non eran digitos\n");
}
else {
// Acabamos la cadena del número con un '\0'
num[j] = '\0';
// Lo convertimos a entero
numero = atoi(num);
// Si el siguiente carácter no es un ':' => entrada no correcta
if (linea[i++] != ':'){
correcto = 0;
printf("non hai : no medio\n");
}
else {
// Extraemos los caracteres del nombre
j = 0;
while ((i < strlen(linea)) && (j < MAX_LON_NOMBRE)) {
// No puede haber ningún otro ':'
if (linea[i] != ':') {
nombre[j++] = linea[i++];
}
// Si hay algún ':' más => dejamos de extraer
else
break; // Sale de este while interior
}
// Si hemos extraÃdo 0 caracteres o no hemos terminado de extraer el
// nombre (sea porque habÃa más caracteres de los que caben en el
// nombre o porque contenÃa algún ':') => entrada no correcta
if ((j == 0) || (i < strlen(linea))){
correcto = 0;
printf("habia : no nombre ou nombre muy largo\n");
}
// Acabamos la cadena del nombre con un '\0'
else nombre[j] = '\0';
}
}
}
// Si la entrada no es correcta, avisamos al usuario
if (!correcto)
fprintf (stdout, "\nLinea mal formada en el fichero (lectores.txt).\n");
// Mientras no tengamos una entrada correcta, seguimos
} while (!correcto);
//Mostramos los datos extraÃdos
fprintf(stdout,"\nEl numero es: %d. Y el nombre es: %s\n\n", numero, nombre);
}
return 0;
}