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