Vous ne pouvez pas vraiment faire cela sans écrire le fichier entier. Vous pouvez chercher au début de la ligne et ensuite écrire la nouvelle ligne. Mais d'abord vous devriez trouver le décalage de cette ligne. Si vous n'avez pas déjà cela, cela signifie lire le fichier depuis le début jusqu'à cette ligne. Ensuite, vous pouvez écrire la nouvelle ligne, mais seulement si elle est exactement la même longueur que la ligne d'origine. Si elle est plus longue, elle écrasera la ligne suivante - il n'y a aucun moyen d'insérer des données dans un fichier. Si la nouvelle ligne est plus courte que l'ancienne, la fin de l'ancienne ligne restera. La même exigence de longueur est également délicate. Cela signifie la même longueur en octets. Selon l'encodage des caractères, certains caractères peuvent nécessiter plus d'octets que d'autres.
Si vous avez vraiment besoin de le faire et le faire fonctionner pour presque tous les cas, vous auriez à utiliser ces étapes:
- Lire le fichier entier pour trouver le décalage de la ligne qui vous intéresse dans
- Seek au décalage de la ligne
- Ecrire la nouvelle ligne
- Ecrivez le reste du fichier que vous lisez à l'étape 1.
Cet algorithme fonctionnera, peu importe la longueur ou la longueur des lignes ou leur encodage. Mais ce sera probablement plus cher que de simplement écrire le fichier entier, surtout si vous l'avez en mémoire de toute façon.
Avez-vous vérifié qu'il n'est pas acceptable d'écrire tout le fichier ou faites-vous une optimisation prématurée ici? Si votre fichier texte est vraiment gros, vous devriez considérer une base de données, comme SQLite, ou utiliser des données de base.
Une base de données serait bien, mais malheureusement, cela ne fonctionnera pas; l'application est conçue pour mettre à jour une base de données massive csv. Je suppose qu'il serait possible pour l'application de convertir le fichier csv en base de données pour un fonctionnement normal, et de reconvertir la base de données en commande csv, mais convertir le tableau en format chaîne pour l'écriture est cher pour la taille du fichier csv , et pourrait conduire à des erreurs de la part des personnes qui récupèrent le fichier csv de l'application. – JoBu1324
Convertir la base de données csv en un tableau est en fait relativement peu coûteux - j'ai trouvé une bibliothèque C décente pour faire la plupart du travail assez rapidement. Il faut environ 1 seconde pour ouvrir le fichier et le convertir en un tableau multidimensionnel. Utiliser -stringByAppendingString: ou -stringByAppendingFormat: recompose le fichier csv est la partie la plus coûteuse, et cela prend au moins une minute (je n'ai jamais pris la peine de savoir combien de temps ça dure, 1 seconde peut être acceptable, mais 2 secondes seraient trop long). Est-ce que la conversion de NSStrings en c-strings ou en NSData rendrait la composition du fichier csv plus rapide? D'autres idées? – JoBu1324
Utilisez-vous vraiment 'stringByAppendingFormat:' pour recréer le fichier CSV entier en une seule chaîne? Cela doit ralentir, car toute la chaîne à laquelle vous ajoutez doit être copiée à chaque fois. Utiliser un 'NSMutableString' à la place devrait accélérer les choses, surtout si vous l'initialisez en utilisant' initWithCapacity: 'pour réserver suffisamment d'espace. Au lieu de construire tout le contenu en une seule chaîne, il pourrait même être plus rapide d'écrire le fichier ligne par ligne. – Sven