Ejemplo n.º 1
0
/*
 * SYNOPSYS :
 *   int syr1_getc(SYR1_FILE *file)
 * DESCRIPTION :
 *   Ce sous-programme lit un caractère à partir du fichier passé en paramètre.
 * PARAMETRES :
 *   file : pointeur sur un descripteur de fichier logique (File Control Bloc)
 * RESULTAT :
 *  valeur (convertie en int) du caractère lu dans le fichier, sinon
 *  -1 : le BCF est NULL, ou le mode d'ouverture est incorrect
 *  -2 : erreur d'entrée-sorties sur le périphérique de stockage
 *  -3 : fin de fichier
 */
int syr1_getc(SYR1_FILE *file) {

    //Only if there's a file passed
    if (file != NULL) {

        //Check the mode
        if (strcmp(file->mode, "r") == 0) {

            //If we can read it
            if (file->block_offset < IO_BLOCK_SIZE) {

                //If not end of file
                if (file->file_offset != file->descriptor.size) {
                    //Read the char
                    int ret = (int)file->buffer[file->block_offset];

                    //If everything's ok
                    file->block_offset++;
                    file->file_offset++;
                    return ret;
                }

                //If EOF reached
                return -3;
            }

            //If we have read all the block
            else {

                //If there is another block to read
                if (file->current_block < (file->descriptor.size/IO_BLOCK_SIZE)) {

                    //Go to the next block
                    file->current_block++;

                    int result_read_next_block = read_block(file->descriptor.alloc[file->current_block], file->buffer);

                    //If ok
                    if (result_read_next_block == 1) {
                        file->block_offset = 0;

                        //Then read the next char after
                        return syr1_getc(file);
                    }

                    //If error
                    return -2;
                }
                
                //If no more block
                return -3;

            }

        }
    }

    //If no BCF or the mode isn't correct
    return -1;
}
Ejemplo n.º 2
0
/*
 * SYNOPSYS :
 *   int syr1_fread(SYR1_FILE *file, int item_size, int nbitem, char* buf)
 * DESCRIPTION :
 *   Ce sous-programme lit nbitem articles de taille item_size dans le fichier
 *   fichier logique passé en paramètre.
 * PARAMETRES :
 *       file : pointeur sur un Bloc Control Fichier (File Control Bloc)
 *  item_size : taille d'un article
 *  nb_item : nombre d'article à lire
 * RESULTAT :
 *   le nombre d'articles effectivement lus dans le fichier, sinon un code
 *   d'erreur (cf syr1_getc())
 *  -1 : le BCF est NULL, ou le mode d'ouverture est incorrect
 *  -2 : erreur d'entrée-sorties sur le périphérique de stockage
 *  -3 : fin de fichier
 */
int syr1_fread(SYR1_FILE *file, int item_size, int nbitem, char* buf) {
    int count = 0;
    while (count<nbitem*item_size) {
        int res = syr1_getc(file);
        if (res<0) {
            return res;
        } else {
            buf[count]=(unsigned char) res;
        }
        count++;
    }
    return count/item_size;
}
Ejemplo n.º 3
0
int main(int argc, char **argv) {
	if (argc!=2) {
		fprintf(stderr,"usage : syr1_cat nom\n");
		return -1;
	} 
	char* nom=argv[1];
	SYR1_FILE* file= syr1_fopen(nom,"r");

	if (file!=NULL) {
		if (verbose) printf("File %s opened successfully\n",nom);
		int res =0;
		while(res>=0) {
			res = syr1_getc(file);
			if (res>=0) printf("%c",(res));
		}
		return syr1_fclose(file);
	} else {
		fprintf(stderr,"Le fichier %s n'existe pas sur le disque disk.img\n",nom);
		return -1;
	}  
}
Ejemplo n.º 4
0
int main(int argc, char **argv)
{
  SYR1_FILE * file_r1 = syr1_fopen("tontons.txt", "r");

  if (file_r1 != NULL) {
    int res;
    do {
      res = syr1_getc(file_r1);
      if (res < 0) {
	if      (res == -3) { fprintf(stderr, "\nFin de fichier !\n"); }
	else if (res == -2) { fprintf(stderr, "\nProblème d'E/S physiques\n"); }
	else if (res == -1) { fprintf(stderr, "\nProblème de BCF\n"); }
      }
      else {
	printf("%c", (char) res);
      }
    } while (res >= 0);
  }
  fflush(stdout);
  if (syr1_fclose(file_r1) < 0)
    printf("\nErreur de fermeture\n");

  return 0;
}
Ejemplo n.º 5
0
int main(int argc, char **argv) {
	int j = 0;
	printf("\n***********************************************************\n");
	printf("Test écriture N°1 : ouverture en écriture du fichier testABC.txt\n");

	SYR1_FILE * file_w = syr1_fopen("testABC.txt", "w");
	if (file_w == NULL) {
		printf("[FAILED] Erreur d'ouverture en écriture pour test.txt\n");
	} else {
		printf("[OK]	Ouverture en écriture réussie\n");
		for (j = 0; j < 10; j++) {
			int res = syr1_fwrite(file_w, 1, strlen(mess), mess);
			if (res != strlen(mess)) {
				printf("[FAILED] Problème pendant l'écriture: code erreur n°%d\n",
						res);
			}
		}

		int res = syr1_fclose(file_w);
		if (res == 0) {
			printf("[OK] 	  Fermeture du fichier réussie\n");
		} else {
			printf("[FAILED] Problème pendant la fermeture : code erreur n°%d\n",res);
		}

		fflush(stdout);
		res = syr1_fclose(file_w);
		if (res == -1) {
			printf("[OK] 	 Impossible de refermer deux fois le même fichier\n");
		} else {
			printf("[FAILED] l'exécution de deux fermetures consécutives d'un même fichier ne provoque pas d'erreurs.\n");
		}
	}

	fflush(stdout);
	printf("\nNombre d'E/S physiques : %d (%d lectures + %d écritures)\n",physical_io_count, physical_read_count,physical_write_count);
	printf("\n***********************************************************\n");
	printf("Test écriture N°2 : Reécriture de 525 caractères dans le fichier testABC.txt\n");

	fflush(stdout);

	file_w = syr1_fopen("testABC.txt", "w");
	if (file_w == NULL) {
		printf("[FAILED] Erreur d'ouverture en écriture pour testABC.txt\n");
	} else {
		printf("[OK]	 Ouverture en écriture réussie\n");
		int nbcar = 0;
		for (j = 0; j < 525; j++) {
			int res = syr1_putc('A' + (nbcar % 10), file_w);
			if (res != 0) {
				printf("[FAILED] Erreur d'écriture pour le %d ème caractère\n",j);
			}
			nbcar++;
		}

		int res = syr1_fclose(file_w);
		if (res == 0) {
			printf("[OK]     Fermeture du fichier réussie\n");
		} else {
			printf("[FAILED] Problème pendant la fermeture : code erreur n°%d\n",res);
		}

		fflush(stdout);
	}

	fflush(stdout);
	printf("\nNombre d'E/S physiques : %d (%d lectures + %d écritures)\n",physical_io_count, physical_read_count,physical_write_count);
	printf("\n***********************************************************\n");
	printf("Test écriture N°3 : Reécriture de 526 caractères dans le fichier test012.txt\n");

	fflush(stdout);

	file_w = syr1_fopen("test012.txt", "w");
	if (file_w == NULL) {
		printf("[FAILED] Erreur d'ouverture en écriture pour test012.txt\n");
	} else {
		printf("[OK]	 Ouverture en écriture réussie\n");
		int nbcar = 0;
		for (j = 0; j < 526; j++) {
			int res = syr1_putc('0' + (nbcar % 10), file_w);
			if (res != 0) {
				printf("[FAILED] Erreur d'écriture pour le %d ème caractère\n",j);
			}
			nbcar++;
		}

		int res = syr1_fclose(file_w);
		if (res == 0) {
			printf("[OK]     Fermeture du fichier réussie\n");
		} else {
			printf("[FAILED] Problème pendant la fermeture : code erreur n°%d\n",res);
		}

		fflush(stdout);
	}

	fflush(stdout);
	printf("\nNombre d'E/S physiques : %d (%d lectures + %d écritures)\n",physical_io_count, physical_read_count,physical_write_count);
	printf("\n***********************************************************\n");
	printf("Test écriture N°4 : relecture du fichier testABC.txt\n");
	SYR1_FILE * file_r = syr1_fopen("testABC.txt", "r");
	if (file_r == NULL) {
		printf("[FAILED] Erreur d'ouverture en relecture pour testABC.txt\n");
	} else {
		printf("[OK]	 Ouverture en relecture réussie\n");
		int nbcar = 0;
		int res = syr1_getc(file_r);
		int nberreur = 0;

		while ((res >= 0) && (nberreur < 5)) {
			if (res != ('A' + (nbcar % 10))) {
				printf("[FAILED] Erreur de relecture '%c/%02X' attendu mais '%c/%02X' lu\n",
						(char) ('A' + (nbcar % 10)),
						(char) ('A' + (nbcar % 10)), res, res);
				nberreur++;
			}
			nbcar++;
			res = syr1_getc(file_r);
		}
		if ((nbcar!=525)) {
			printf("[FAILED] Le nombre de caractère lu ne correspond pas à la taille du fichier sur le disque\n");
		}
		if ((res == -3) && (nberreur == 0) && (nbcar==525)) {
			printf("[OK]     La relecture a fonctionné correctement\n");
		}
	}

	syr1_fclose(file_r);
	printf("\nNombre d'E/S physiques : %d (%d lectures + %d écritures)\n",physical_io_count, physical_read_count,physical_write_count);	
	printf("\n***********************************************************\n");
	printf("Test écriture N°5 : relecture du fichier test012.txt \n");
	file_r = syr1_fopen("test012.txt", "r");
	if (file_r == NULL) {
		printf("[FAILED] Erreur d'ouverture en relecture pour test012.txt\n");
	} else {
		printf("[OK]	 Ouverture en relecture réussie\n");

		int nbcar = 0;
		int res = syr1_getc(file_r);
		int nberreur = 0;

		while ((res >= 0) && (nberreur < 5)) {
			if (res != ('0' + (nbcar % 10))) {
				printf("[FAILED] Erreur de relecture '%c/%02X' attendu mais '%c/%02X' lu\n",
						(char) ('0' + (nbcar % 10)),
						(char) ('0' + (nbcar % 10)), res, res);
				nberreur++;
			}			nbcar++;
			res = syr1_getc(file_r);
		}
		if ((nbcar!=526)) {
			printf("[FAILED] Le nombre de caractère lu ne correspond pas à la taille du fichier test2.txt\n");
		}
		if ((res == -3) && (nberreur == 0) && (nbcar==526)) {
			printf("[OK]     La relecture a fonctionné correctement\n");
		}
	}

	syr1_fclose(file_r);
	printf("\nNombre d'E/S physiques : %d (%d lectures + %d écritures)\n",physical_io_count, physical_read_count,physical_write_count);
	printf("\n*********************************************************\n");
	printf("Test écriture N°6 : test de la taille maximum d'un fichier\n");

	file_w = syr1_fopen("test3.txt", "w");
	if (file_w == NULL) {
		printf("[FAILED] Erreur d'ouverture en écriture pour test.txt\n");
	} else {
		printf("[OK]	 Ouverture en écriture réussie\n");
		int nbcar = 0;
		int res = syr1_putc('A' + (nbcar % 10), file_w);

		while (res >= 0) {
			nbcar++;
			res = syr1_putc('A' + (nbcar % 10), file_w);
		}
		if (res == -3) {
			printf("[OK]     Taille maximum de fichier atteinte pour nbcar=0x%04X/%d\n",
					nbcar, nbcar);
		} else {
			printf("[FAILED] Autre erreur : code erreur n°%d\n", res);
		}
	}

	fflush(stdout);
	int res = syr1_fclose(file_w);
	if (res < 0) {
		printf("[FAILED] Erreur fermeture : code erreur n°%d\n", res);
	} else {
		printf("[OK]	 Fermeture réussie\n");
	}
	printf("\nNombre d'E/S physiques : %d (%d lectures + %d écritures)\n",physical_io_count, physical_read_count,physical_write_count);
	printf("\n***********************************************************\n");
	printf("Test écriture N°7 : relecture du fichier de taille maximum\n");

	file_r = syr1_fopen("test3.txt", "r");
	if (file_r == NULL) {
		printf("[FAILED] Erreur d'ouverture en relecture pour test.txt\n");
	} else {
		printf("[OK]	 Ouverture en relecture réussie\n");
		int nbcar = 0;
		int res = syr1_getc(file_r);
		int nberreur = 0;
	
		while ((res >= 0) && (nberreur < 5)) {
			if (res != ('A' + (nbcar % 10))) {
				printf("[FAILED] Erreur de relecture '%c/%02X' attendu mais '%c/%02X' lu\n",
						(char) ('A' + (nbcar % 10)),
						(char) ('A' + (nbcar % 10)), res, res);
				nberreur++;
			}
			nbcar++;
			res = syr1_getc(file_r);
		}
		if ((res == -3) && (nberreur == 0)) {
			printf("[OK]     La relecture a fonctionné correctement\n");
		} else {
			printf("[FAILED] Problème lors de la relecture du fichier de taille maximale erreur = %d après %d caractères\n",
					res, nbcar);
		}
	}
	syr1_fclose(file_r);

	printf("\nNombre d'E/S physiques : %d (%d lectures + %d écritures)\n",physical_io_count, physical_read_count,physical_write_count);

	return 0;
}
Ejemplo n.º 6
0
int main(int argc, char **argv)
{
  printf("Test d'ouvertue en lecture d'un fichier non present sur le disque\n");
  SYR1_FILE* file_r1=syr1_fopen("bidon.txt","r");
  if (file_r1==NULL) {
    printf("[OK] 	 Erreur d'ouverture pour le fichier bidon.txt\n");
  } else {
    printf("[FAILED] Ouverture de bidon.txt réussie \n");
  }
  fflush(stdout);

  printf("\nTest d'une 1ère ouverture en lecture d'un fichier présent sur le disque\n");
  file_r1=syr1_fopen("villon.txt","r");
  if (file_r1==NULL) {
    printf("[FAILED] Erreur d'ouverture en lecture pour un fichier existant sur le disque\n");
  } else {
    printf("[OK] 	 Ouverture n°1 de villon.txt réussie \n");
    printf("\nTest de lecture du contenu du fichier n°1\n");
    int nbcar= 0;
    int res;
    do {
      res = syr1_getc(file_r1);
      if (res<0) {
	if (res==-3) printf("\n\n[OK] Fin de fichier après 0x%04X caractères lus\n",nbcar);
	if (res==-2) printf("\n\n[FAILED] Problème d'E/S physiques\n");
	if (res==-1) printf("\n\n[FAILED] Problème de BCF\n");
      } else {
	nbcar++;
	printf("%c", (char)res);
      }
    } while (res>=0);
  }
  fflush(stdout);

  printf("Test d'une 2ème ouverture en lecture du fichier villon.txt\n");
  SYR1_FILE* file_r2=syr1_fopen("villon.txt","r");
  if (file_r2==NULL) {
    printf("[FAILED] Erreur d'ouverture en lecture pour un fichier existant sur le disque\n");
  } else {
    printf("[OK]     Ouverture n°2 de villon.txt réussie \n");
    printf("Test de lecture du contenu du fichier n°2\n");
    int nbcar= 0;
    int res;
    do {
      res = syr1_getc(file_r2);
      if (res<0) {
	if (res==-3) printf("\n\n[OK] Fin de fichier après 0x%04X caractères lus\n",nbcar);
	if (res==-2) printf("\n\n[FAILED] Problème d'E/S physiques\n");
	if (res==-1) printf("\n\n[FAILED] Problème de BCF\n");
      } else {
	nbcar++;
	//printf("%c", (char)res);
      }
    } while (res>=0);
  }
  fflush(stdout);
  syr1_fclose(file_r1);
  syr1_fclose(file_r2);

	printf("Nombre d'E/S physiques : %d\n",physical_io_count);

  return 0;
}