2010-07-14 11 views
2

fichier texte (ou CSV) est:Comment insérer des données dans un fichier CSV pré-alloué?

Data:,,,,,\n 

(mais avec 100 », "s)

en C ou C++, je voudrais ouvrir le fichier, puis remplir des valeurs entre le", ".
IE- Data:,1,2,3,4,\n

Je devine que je besoin d'une sorte de recherche pour trouver la prochaine virgule, insertion de données, trouver la prochaine insertion des virgules, etc.

Je regardais memchr() pour une tampon et se demandait s'il y a quelque chose de similaire pour un fichier texte?

Si vous pouviez me diriger dans la bonne direction, je l'apprécierais.

(je ne me dérange pas de lire un livre pour trouver quelque chose comme ça non plus, je ne sais pas exactement ce livre aurait cette information?)

Merci.

Répondre

3

Vous ne pouvez pas réellement le faire en C ... si vous ouvrez en mode lecture/écriture, vous écrasez les caractères, pas les insérez.

http://c-faq.com/stdio/fupdate.html

Vous devez ouvrir le fichier, lisez la ligne en mémoire, écrire la nouvelle ligne à un fichier temporaire.

Une fois que vous avez terminé d'insérer toutes les lignes, copiez le fichier temporaire sur le fichier d'origine. Je ne pense pas qu'il existe un autre moyen de le faire.

+1

En fonction de la taille du fichier, il suffit de le charger entièrement en mémoire, puis d'insérer les données lors de la réécriture. Cela ne nécessiterait pas de fichier temporaire. –

+1

L'autre raison pour laquelle un fichier temporaire est utilisé est de s'assurer que s'il y a un plantage, vous ne remplacez pas le bon vieux fichier par un nouveau fichier corrompu à moitié fini. Ce n'est pas vraiment important dans ce cas, puisque l'ancien fichier est juste un modèle vide. – caf

2

(Ceci est pour le cas C++) Il suffit d'analyser les données dans une liste liée avec les objets qui contiennent les données, modifier les données et remplacer le fichier.

Vous devez d'abord diviser vos données en lignes (\ n crée une nouvelle liste chaînée Element):

Data:,,,,,\n 
Data2:,,,,,\n 

obtiendrez les cordes (pseudolist):

[ "Data: ,, ,,, ", "Données2: ,,,,,"]

Alors maintenant, vous devez définir votre objet pour chaque ligne comme:

class LineStruct { 
    public: 
    string head; 
    LinkedList<string> data; 
}; 

et remplissez-le.

Ensuite, vous éditez la structure de données et ensuite vous l'écrivez sur le disque.

1

Si vous avez

Data:,,,,,\n 

alors il n'y a pas d'espace entre le, pour remplir, vous devez écrire des lignes de nouvelle marque.

Toutefois, si vous aviez

Data: , , , , , \n 

alors vous pourriez remplacer seulement les parties représentées par ' '

en C vous chercheriez à la partie du fichier et écrire et ensuite chercher à la prochaine pos, désolé pas de code sur le dessus de ma tête.

1

C'est là que je regarderais:

Comme suggéré par wmils answer, vous devrez soit utiliser un fichier temporaire, soit conserver toutes les nouvelles lignes en mémoire jusqu'à ce que toutes les lignes soient traitées, puis écrasez le fichier d'origine.

Questions connexes