elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección


  Mostrar Temas
Páginas: [1]
1  Programación / Programación C/C++ / [RESUELTO]Comprobar formato de un fichero de texto en: 9 Mayo 2017, 19:23 pm
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
Código:
#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;
}
Páginas: [1]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines