2010-01-24 4 views
0

Actuellement, j'utilise les API ReadFile() et WriteFile() pour écrire & read from file. Existe-t-il des fonctions API pour remplacer/éditer le texte si les données sont suffisamment grandes pour être écrites à nouveau? J'ai seulement entendu parler de SetFilePointer() mais je ne suis pas sûr de savoir comment l'utiliser pour remplacer le texte d'un fichier. Par exemple, sélectionnez une chaîne/char à partir du fichier say, valeur '0' de Key2.Modifier les valeurs dans config. fichier

Key1 = 0
Key2 = 0

et changer à '1'.

clé1 = 0
Touche2 = 1

Répondre

2

les fonctions GetPrivateProfileString et WritePrivateProfileString pourrait être bon pour cela.

+0

Cela fonctionne bien sûr en réécrivant le fichier entier. –

+0

@Neil: J'ai supposé cela aussi et je ne l'ai pas mentionné parce que je pensais que c'était évident. Mais il s'avère que ce n'est pas le cas. Je viens d'appeler WritePrivateProfileString et j'ai utilisé filemon et un sniffer de réseau et j'ai constaté qu'il n'écrit pas le fichier entier s'il n'a pas besoin de changer la longueur de la valeur de la clé. Sur mon PC (XP), il n'écrit que 4K quand la taille de la clé est la même. Donc, en réalité, cela peut être très efficace. D'un autre côté, la lecture des données n'est pas très efficace car elle doit analyser le fichier pour trouver l'emplacement de mise à jour en premier lieu. –

+0

Eh bien, vous vivez et apprenez! Merci pour l'info. –

1

Il y a beaucoup d'API pour l'accès aléatoire aux fichiers. Ils sont presque totalement inadaptés pour traiter les fichiers texte. Considérer si au lieu de changer 1 chiffre, vous avez changé de 1 à 2 - c'est-à-dire de 1 "à" 20 ", vous devez implémenter non seulement la méthode d'accès aléatoire" efficace ", mais aussi" inefficace " "récrire le chemin de fichier. Comme vous ne jamais vraiment envie d'une façon de faire les choses, le « un inefficace » est celui d'aller.

+0

quel type de fichier serait approprié pour une telle opération de manière efficace? – cpx

+1

Un bloc structuré. Mais alors vous ne seriez pas en mesure de l'éditer avec un éditeur de texte, qui est l'une des principales exigences pour les fichiers de configuration. –

0

Pour les fichiers texte, il est préférable de les lire dans la mémoire, de faire votre travail et de les réécrire: par exemple, lisez le contenu du fichier dans un std::string, recherchez Key2 = et remplacez le Le reste de la ligne avec la nouvelle valeur. Ensuite, sauvegardez la chaîne à nouveau. Vous pouvez utiliser std::ifstream pour lire à partir d'un fichier sans un seul appel WinAPI.

Questions connexes