2010-07-13 18 views
0

Comment lire plusieurs lignes d'un fichier texte (largeur variable) et les stocker toutes dans une "chaîne" C?Lire plusieurs lignes d'un fichier dans une chaîne en C

EDIT: Je suppose que je vais fget'ing les chaînes et les stocker dans un tampon flexible (via realloc) :) Aussi, ce n'est pas devoirs même si cela semble apparemment si (programmation est juste un passe-temps pour moi). Je demandais juste par curiosité

+0

Est-ce que ce sont les devoirs? Avez-vous essayé quelque chose que vous pouvez nous montrer? Avez-vous plus de détails à partager? – Cogwheel

+0

Non, ce n'est pas les devoirs; Je me suis amusé (mes études sont dans le domaine des soins de santé) Je pensais lire les ficelles avec des fgets, puis les regrouper en une seule corde finale, mais je voulais juste savoir s'il y avait une façon plus efficace de le faire. Je vais l'essayer de toute façon, tout en lisant les réponses possibles :) – pwseo

Répondre

1

Voici le processus général

  1. Créer un tampon initial.
  2. Lit une ligne à partir du fichier ou jusqu'à l'espace restant dans le tampon.
  3. EOF? Passer à 6.
  4. Rempli le tampon? Réallouer avec plus d'espace.
  5. Rincer et répéter.
  6. Ajouter une terminaison 0
+0

C'est ce que je pensais ... J'ai juste demandé parce qu'il pourrait y avoir une certaine abstraction dont je n'étais pas au courant. Merci quand même – pwseo

+0

Il existe des méthodes de chaînes supplémentaires dans 'string.h', mais rien de directement applicable à votre problème. Si vous voulez programmer en C, vous devez vous habituer à faire ce genre de chose vous-même. –

+0

Et j'aime le niveau bas de C ... Mais parfois je suis juste paresseux lol – pwseo

0

Est-ce que ce travail est fait? La chose délicate ici est que vous devez garder une trace de la longueur de la chaîne et combien elle est utilisée/vide. Soit vous devinez assez haut pour commencer, ou appelez malloc() ou l'un de ses frères lorsque vous êtes à court d'espace.

+0

Est-ce que c'est souvent ce devoir? : \ De toute façon, je vais le faire avec malloc et realloc alors. – pwseo

+0

@pwseo: Apparemment :) – Cogwheel

1

Puisque ce ne semble pas devoir, voici quelques exemples de code de la façon dont je le ferais. Je ne fais qu'allouer un énorme bloc de mémoire pour le fichier entier, puisque vous allez lire le tout de toute façon, mais si vous traitez des fichiers volumineux, il est généralement préférable de les traiter ligne par ligne.

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

int main(int argc, char *argv[]) 
{ 
     // first, get the name of the file as an argument 
     if (argc != 2) { 
       printf("SYNTAX: %s <input file>\n", argv[0]); 
       return -1; 
     } 

     // open the file 
     FILE* fp = fopen(argv[1], "r"); 

     if (fp == NULL) { 
       printf("ERROR: couldn't open file\n"); 
       return -2; 
     } 

     // seek to the end to get the length 
     // you may want to do some error-checking here 
     fseek(fp, 0, SEEK_END); 
     long length = ftell(fp); 

     // we need to seek back to the start so we can read from it 
     fseek(fp, 0, SEEK_SET); 

     // allocate a block of memory for this thing 
     // the +1 is for the nul-terminator 
     char* buffer = malloc((length + 1) * sizeof(char)); 

     if (buffer == NULL) { 
       printf("ERROR: not enough memory to read file\n"); 
       return -3; 
     } 

     // now for the meat. read in the file chunk by chunk till we're done 
     long offset = 0; 
     while (!feof(fp) && offset < length) { 
       printf("reading from offset %d...\n", offset); 
       offset += fread(buffer + offset, sizeof(char), length-offset, fp); 
     } 

     // buffer now contains your file 
     // but if we're going to print it, we should nul-terminate it 
     buffer[offset] = '\0'; 
     printf("%s", buffer); 

     // always close your file pointer 
     fclose(fp); 

     return 0; 
} 

Ouf, ça fait longtemps que je n'ai pas écrit de code C. Espérons que les gens vont entrer avec des corrections utiles/avis de problèmes massifs. :)

+0

C'est une solution intéressante ... Vous venez de me donner une idée. Tout au long de mon fichier j'ai quelques délimiteurs ...Je pourrais pré-scanner le fichier et construire une liste de délimiteurs, puis le parcourir à nouveau en utilisant cette liste pour allouer de la mémoire (la différence de position de deux délimiteurs est la taille de la chaîne entre eux). Merci! – pwseo

+0

Que diriez-vous de 'fstat' pour obtenir la longueur du fichier au lieu de' fseek' + 'ftell' +' fseek'? –

0

Vous pouvez essayer la mise en œuvre de chaîne « longueur variable » ici:

How to implement a variable-length ‘string’-y in C

Et puis, vous devrez écrire l'opération « ajouter » à la chaîne. Ensuite, vous pouvez lire en toute sécurité n'importe quel morceau d'octets et le concaténer à ce que vous avez déjà lu.

+0

J'ai implémenté un type de chaîne de longueur variable dans le passé, donc je vais l'utiliser à la place, mais merci quand même, Baltasarq :) – pwseo

Questions connexes