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;
}