pdf - e-book - archive - github.com

2.9  Fichiers

2.9.1  Ouverture et fermeture

Exercice 1 touch

La commande shell touch permet de créer un fichier vide. Ecrire un programme prenant le nom d’un fichier en ligne de commande et le créant.

2.9.2  Lecture

Exercice 2 more

La commande shell more permet d’afficher le contenu d’un fichier. Ecrire un programme prenant le nom d’un fichier en ligne de commande et affichant son contenu.

2.9.3  Ecriture

Exercice 3 Alphabet

Ecrire un programme C alphabet permettant de créer un fichier. Le nom du fichier crée sera passé en ligne de commande et le fichier contiendra l’alphabet.

Exercice 4 Initialiser un fichier

Ecrire un programme C createFile permettant de créer un fichier. Le nom du fichier crée sera le premier des arguments, tous les arguments suivants seront écrits dans le fichier. Par exemple, la commande ./createFile toto.txt ceci est le contenu de mon fichier doit créer un fichier appelé toto.txt et contenant le texte

ceci est le contenu de mon fichier

2.9.4  Lecture et écriture

Exercice 5 cp

La commande shell cp permet d’afficher le contenu d’un fichier. Ecrire un programme prenant en ligne de commande le nom d’un fichier source et celui d’un fichier de destination, et recopiant le contenu du fichier source dans celui de destination.

Exercice 6 Liste de noms

Ecrire deux programmes storeNames et getNames. storeNames demande à l’utilisateur de saisir une liste de noms et les enregistre au fur et à mesure qu’ils sont saisis dans un fichier dont le nom a été passé en ligne de commande au lancement du programme. On arrête le programme en saisissant −1. getNames affiche la liste des noms stockée dans le fichier dont le nom est passé en ligne de commande.

2.9.5  Enigma

Compléter le fichier source suivant :

#include<stdio.h>
#include<stdlib.h>

#define NB_ROTORS 5
#define NB_LETTERS 26

#define FORWARD 1
#define BACKWARD 2

/***********************************************/

typedef struct rotor
{
  char permutation[NB_LETTERS];
  char permutationInverse[NB_LETTERS];
  char position;
}rotor;

/***********************************************/

typedef struct enigma
{
  rotor rotors[NB_ROTORS];
  char mirror[NB_LETTERS];
}enigma;

/***********************************************/

/*
  Dispose tous les rotors dans leur position de depart.
*/

void initialiseRotors(enigma* e)
{
}

/***********************************************/

/*
  Libere la memoire occupee par e.
*/

void enigmaDestroy(enigma* e)
{
}

/***********************************************/

/*
  Alloue la memoire et initialise les champs.
*/

enigma* enigmaCreate()
{
  return NULL;
}

/***********************************************/

/*
  Retourne le rang de letter dans l'alphabet, en indicant 
  a partir de 0.
*/

char indexOfLetter(char letter)
{
  return 0;
}

/***********************************************/

/*
  Retourne la lettre d'indice index dans l'alphabet, 
  'a' est d'indice 0.
 */

char letterOfIndex(char index)
{
  return 0;
}

/***********************************************/

/*
  Fait de la lettre cipherLetter l'image de la lettre 
  d'indice clearIndex par un passage dans le rotor d'indice rotorIndex
  de e.
*/

void setImage(enigma* e, int rotorIndex, int clearIndex, char cipherLetter)
{
}

/***********************************************/

/*
  Fait de firstLetter le reflet de secondLetter.
 */

void setMirror(enigma* e, char firstLetter, char secondLetter)
{
}

/***********************************************/

/*
  Retourne vrai si et seulement si letter est une minuscule
  de l'alphabet.
 */

int isEncryptable(char letter)
{
  return 0;
}

/***********************************************/

/*
  Affiche les rotors et le miroir de e.
*/

void enigmaPrint(enigma* e)
{
}

/***********************************************/

/*
  Fait pivoter le rotor d'indice indexOfRotor de e
  en modifiant sa position de depart. Retourne 
  vrai ssi le rotor est revenu dans sa position 
  initiale.
*/

int rotateRotor(enigma* e, int indexOfRotor)
{
  return 0;
}

/***********************************************/

/*
  Fait pivoter le jeu de rotors de e d'une position.
*/

void rotateRotors(enigma* e)
{
}

/***********************************************/

/*
  Indice d'entree de la lettre d'indice indexOfLetter 
  dans le rotor r, en tenant compte de la position de 
  ce rotor.
*/

int inputIndex(rotor* r, int indexOfLetter)
{
  return 0;
}

/***********************************************/

/*
  Indice de la lettre sortie a l'indice indexOfLetter 
  du rotor r, en tenant compte de la position de 
  ce rotor.
*/

int outputIndex(rotor* r, int indexOfLetter)
{
  return 0;
}

/***********************************************/

/*
  Fait passer la lettre d'indice indexOfLetter dans r
  dans la direction direction (FORWARD ou BACKWARD).
 */

int rotorEncrypt(rotor* r, int indexOfLetter, char direction)
{
  return 0;
}

/***********************************************/

/*
  Fait passer la lettre d'indice indexOfLetter dans 
  le miroir de e.
*/

int mirrorEncrypt(enigma* e, int indexOfLetter)
{
  return 0;
}

/***********************************************/

/*
  Chiffre letter avec e, fait ensuite pivoter les rotors
  de e..
*/

char enigmaEncrypt(enigma* e, char letter)
{
  return 0;
}

/***********************************************/

/*
  Chiffre le fichier clearFName avec e, ecrit le resultat 
  dans cipherFName.
*/

void encryptFile(enigma* e, char* clearFName, char* cipherFName)
{
}

/***********************************************/

/*
  Initilialise les NB_ROTORS rotors de e avec deux 
  ecrits dans le fichier rotors.
 */

void loadRotors(enigma* e, FILE* rotors)
{
}

/***********************************************/

/*
  Initilialise le miroir de e avec une ligne du fichier rotors.
 */

void loadMirror(enigma* e, FILE* rotors)
{
}

/***********************************************/

/*
  Cree une machine enigma initialisee avec le contenu du fichier 
  rotorFileName.
*/

enigma* loadFile(char* rotorFileName)
{
  return NULL;
}

/***********************************************/

/*
  Chiffre le fichier clear avec la machine enigma 
  decrite dans rotors, ecrit le resultat dans cipher.
*/

void enigmaRun(char* clear, char* cipher, char* rotors)
{
  enigma* e = loadFile(rotors);
  encryptFile(e, clear, cipher);  
  enigmaDestroy(e);
}

/***********************************************/

int main(int argc, char* argv[])
{
  if (argc == 4)
    enigmaRun(argv[1], argv[2], argv[3]);
  else
    printf("usage : ./enigma source cipher rotorfile\n ");
  return 0;
}

Télécharger le fichier

klmnopqvwxyzgabcdefhijrstu
uvwxystzabcdejklmnopqrfghi
klmnopqabcdvwxyzgstuefhijr
zgabcdefklmnopqvhijrstuwxy
tuklmnopqvwxyzgabcdefhijrs
wzgabchijrmdefynopqvstuklx

Télécharger le fichier

Que contient le message suivant ? (attention, les accents s’affichent mal...)

Bobuq, uynl myck ipyvp zémjbé lr lpkn zvw eywbovtssi !

Télécharger le fichier