2011-08-11 5 views
0

Il s'agit probablement d'une question stupide! J'ai un fichier texte rempli de nombres aléatoires et je voudrais lire ces nombres dans un tableau.C - Lire multiline à partir d'un fichier texte

Mon fichier texte ressemble à ceci:

1231231 123213 123123 
1231231 123213 123123 
0 

1231231 123213 123123 
1231231 123213 123123 
0 

Et ainsi de suite .. Le morceau de numberse se termine par 0

C'est ce que je l'ai essayé jusqu'à présent:

FILE *file = fopen("c:\\Text.txt", "rt"); 
char line[512]; 

if(file != NULL) 
{ 
    while(fgets(line, sizeof line, file) != NULL) 
    { 
     fputs(line, stdout); 
    } 
    fclose(file); 
} 

Cela ne fonctionne évidemment pas, puisque j'ai lu chaque ligne dans la même variable.

Comment puis-je lire les lignes et quand la ligne obtient la ligne où elle se termine par 0, alors stocker ce morceau de texte dans un tableau?

Toute aide est appréciée.

+0

Vous voulez un tableau de chaînes? – cnicutar

+0

@cnicutar - Oui – Lars

+0

@Lars: Vous voulez les chaînes textuelles, plutôt que les numéros acutaux? –

Répondre

1

Il vous suffit de stocker les numéros que vous avez lus dans le fichier dans un stockage permanent! Aussi, vous voulez probablement analyser les nombres individuels et obtenir leur représentation numérique. Donc, trois étapes:

  1. Allouer de la mémoire pour contenir les nombres. Un tableau de tableaux ressemble à un concept utile, un tableau pour chaque bloc de nombres.

  2. Marquez chaque ligne en chaînes correspondant à un nombre chacune, en utilisant strtok.

  3. Analyser chaque nombre en un nombre entier en utilisant atoi ou strtol.

Voici quelques exemples de code pour vous aider à démarrer:

FILE *file = fopen("c:\\Text.txt", "rt"); 
char line[512]; 

int ** storage; 
unsigned int storage_size = 10; // let's start with something simple 
unsigned int storage_current = 0; 

storage = malloc(sizeof(int*) * storage_size); // later we realloc() if needed 

if (file != NULL) 
{ 
    unsigned int block_size = 10; 
    unsigned int block_current = 0; 

    storage[storage_current] = malloc(sizeof(int) * block_size); // realloc() when needed 

    while(fgets(line, sizeof line, file) != NULL) 
    { 
     char * tch = strtok (line, " "); 
     while (tch != NULL) 
     { 
      /* token is at tch, do whatever you want with it! */ 

      storage[storage_current][block_current] = strtol(tch, NULL); 

      tch = strtok(NULL, " "); 

      if (storage[storage_current][block_current] == 0) 
      { 
       ++storage_current; 
       break; 
      } 

      ++block_current; 

      /* Grow the array "storage[storage_current]" if necessary */ 
      if (block_current >= block_size) 
      { 
       block_size *= 2; 
       storage[storage_current] = realloc(storage[storage_current], sizeof(int) * block_size); 
      } 
     } 

     /* Grow the array "storage" if necessary */ 
     if (storage_current >= storage_size) 
     { 
      storage_size *= 2; 
      storage = realloc(storage, sizeof(int*) * storage_size); 
     } 
    } 
} 

En fin de compte, vous devez libérer la mémoire:

for (unsigned int i = 0; i <= storage_current; ++i) 
    free(storage[i]); 
free(storage); 
+0

Je pense que vous devez 's/int/storage/g' dans quelques endroits. – user786653

+0

@user: Oui, repéré que déjà - merci! Est-ce que 'realloc' déplace la mémoire existante? –

+1

C'est le cas. Une chose à noter avec 'realloc' est que' p = realloc (p, sz) 'est une sorte d'anti-pattern car le code fuira si' p! = NULL' et 'realloc' retourne' NULL'. Cela n'aura probablement pas beaucoup d'importance ici. – user786653

Questions connexes