Lecture et écriture de données dans un fichier
epetit91
Membre
Bonsoir,
Je cherche à faire la chose suivante :
Ouvrir un fichier
Lire une structure de données (des short) dans ce fichier
Refermer le fichier
Créer et ouvrir un nouveau fichier
Ecrire le contenu de la structure dans ce fichier
Refermer le fichier
J'ai écris le code suivant :
Définition de la structure :
typedefstruct_EnteteDonnees
{
short data1;
short data1;
short data1;
short data1;
short data1;
} EnteteDonnees;
Code :
- (void) InfoEntete
{
NSFileHandle *file;
EnteteDonnees entete;
NSUInteger tailleData;
// Ouverture du fichier d'entrée
file = /color][color=#6f41a8]NSFileHandle[/color][color=#000000] [/color]fileHandleForReadingAtPath[color=#000000]:[[[/color][color=#6f41a8]NSUserDefaults[/color][color=#000000] [/color]standardUserDefaults[color=#000000 stringForKey:@InputFilePath]];
// Le fichier est introuvable
if (nil == file)
{
NSRunCriticalAlertPanel(NSLocalizedString(@erreur ouverture fichier, nil),
NSLocalizedString(@erreur fichier introuvable, nil), @OK, nil, nil,
[color=#6f41a8]NSUserDefaults[/color] [color=#3d2380]standardUserDefaults[/color stringForKey:@InputFilePath]);
return;
}
tailleData = sizeof(EnteteDonnees);
[[file readDataOfLength:tailleData] getBytes:&entete length:tailleData];
[file closeFile];
}
Ce code fonctionne pour la lecture mais je ne suis pas certain de bien procéder.
En revanche, je ne sais pas comment réaliser la partie de création et d'écriture dans un autre fichier contenu dans la clé "OutputFilePath".
Quelqu'un pourrait-il m'aider ?
Je suis sous OSX Lion.
Avec tous mes remerciements.
Je cherche à faire la chose suivante :
Ouvrir un fichier
Lire une structure de données (des short) dans ce fichier
Refermer le fichier
Créer et ouvrir un nouveau fichier
Ecrire le contenu de la structure dans ce fichier
Refermer le fichier
J'ai écris le code suivant :
Définition de la structure :
typedefstruct_EnteteDonnees
{
short data1;
short data1;
short data1;
short data1;
short data1;
} EnteteDonnees;
Code :
- (void) InfoEntete
{
NSFileHandle *file;
EnteteDonnees entete;
NSUInteger tailleData;
// Ouverture du fichier d'entrée
file = /color][color=#6f41a8]NSFileHandle[/color][color=#000000] [/color]fileHandleForReadingAtPath[color=#000000]:[[[/color][color=#6f41a8]NSUserDefaults[/color][color=#000000] [/color]standardUserDefaults[color=#000000 stringForKey:@InputFilePath]];
// Le fichier est introuvable
if (nil == file)
{
NSRunCriticalAlertPanel(NSLocalizedString(@erreur ouverture fichier, nil),
NSLocalizedString(@erreur fichier introuvable, nil), @OK, nil, nil,
[color=#6f41a8]NSUserDefaults[/color] [color=#3d2380]standardUserDefaults[/color stringForKey:@InputFilePath]);
return;
}
tailleData = sizeof(EnteteDonnees);
[[file readDataOfLength:tailleData] getBytes:&entete length:tailleData];
[file closeFile];
}
Ce code fonctionne pour la lecture mais je ne suis pas certain de bien procéder.
En revanche, je ne sais pas comment réaliser la partie de création et d'écriture dans un autre fichier contenu dans la clé "OutputFilePath".
Quelqu'un pourrait-il m'aider ?
Je suis sous OSX Lion.
Avec tous mes remerciements.
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
J'ai pri un fichier texte dans l'exemple, pour stocker la liste de shorts (séparés par un CR : @\n) sous forme de strings (que tu peux transformer en short, une fois chargées).
Mais ce pourrait aussi être un fichier "ListOfShorts.plist" (situé par exemple dans le bundle de l'appli) contenant un array de strings ou de Numbers que tu charges comme suit :
NSString, NSArray, NSData possèdent des Class methods de lecture dans un fichier, de la forme :
string(array, data)WithContentsOfFile:path
et des instances methods pour l'écriture dans un fichier de la forme :
writeToFile:path atomically:yesOrNo
Comment est-ce que je fais la transition entre le fait que tu lises et écrives une chaà®ne et le fait que je veuille lire et écrire la structure que j'ai définie dans mon exemple.
Ce que je ne vois pas non plus c'est comment tu ouvres le fichier d'entrée (ce que j'ai écrit dans mon exemple est-il correct /huh.gif' class='bbc_emoticon' alt='???' />) et comment tu crées et ouvres le fichier de sortie.
Ce que je comprends dans ton exemple c'est que le fichier de sortie est déjà présent sur le disque.
Merci encore et désolé pour ces questions peut être triviales pour certains...
tu renseignes les valeurs dans la structure avec les données que tu as chargées
cette seule ligne ouvre le fichier d'entrée (qui est sur le bureau pour l'exemple), lit les données, les stocke dans une string et ferme le fichier :
non il est crée et rempli avec la outputString par la ligne :
Merci également Smy pour ta remarque. Je préfère, dans la mesure du possible, écrire du "pur Cocoa" car c'est pour moi aussi un moyen de progresser surtout quand on a la chance d'avoir un forum aussi compétent.
Merci à tous.
En complément de l'aide que tu m'as apportée dans mon problème de lecture écriture de fichier, peux-tu me dire comment fait-on pour écrire des données à la suite d'un fichier ?
Dans ton exemple
ce code crée le fichier "path" et y écrit "outputstring".
Au cours du déroulement du programme, je veux continuer à écrire des string dans ce fichier.
Comment dois-je faire pour écrire des string à la suite du fichier "path" ?
Question complémentaire : à l'issue de la ligne suivante
le fichier est-il fermé automatiquement ou doit-on écrire une instruction particulière ?
La gestion des fichiers est vraiment ma bête noire en Cocoa !!!!
Merci encore pour ton aide.
Cordialement
L'inconvénient de cette méthode c'est que comme c'est une méthode de commodité, son but est de réduire la quantité de code à écrire pour juste écrire une chaà®ne dans un fichier, donc elle n'expose pas spécialement toutes les subtilités et possibilités que tu pourrais vouloir. Si tu veux un peu plus de maà®trise dans l'écriture des données, écrire des données binaires, choisir les attributs du fichier écrit (droits d'accès, flags, etc), ou écrire à la fin d'un fichier plutôt que d'écraser un existant, tu as des classes un peu plus poussées pour faire cela
Pour écrire dans un fichier, tu as plusieurs solutions, globalement équivalentes :
Cela te donne une idée des différentes possibilités, chacune ayant des avantages et inconvénients différents. Perso je te conseillerai l'approche NSFileHandle, qui me semble la plus simple et explicite.
Je pense que je vais utiliser la classe NSFileHandle.
Merci encore