2011-11-23 2 views
3

J'ai un fichier que j'ai besoin de stocker dans un tableau à deux dimensions pour pouvoir effectuer des opérations matricielles. Tout ce que je sais est que les doubles seront séparés par des espaces et des sauts de ligne, par exemple:Comment entrer un fichier de données dans un tableau 2D

2.04 3.0 4.0 
5.0 6.1 7.0 
8.0 9.03 10.0 

Je ne veux pas connaître le nombre de numéros, il y aura, donc je besoin d'une fonction d'analyse évolutive. Jusqu'à présent, j'ai:

int main(int argc, char* argv[]) 
{ 
    FILE *fp; 
    char ch; 
    fp = fopen("matrix.dat","r"); 
    if (fp == NULL) 
    { 
     puts ("Cannot open source file"); 
    } 

    /*count the number of lines*/ 
    int lines=1; 
    char c; 
    while((c = fgetc(fp)) != EOF) 
    { 
     if(c == '\n') 
      lines++; 
    } 
    printf("lines= %i\n",lines); 

    /*reopen the file to reset the pointer*/ 
    fclose(fp); 
    fp = fopen("matrix.dat","r"); 
    double m[lines][lines]; 

    /*Load file into array*/ 
    int i,j; 
    for(i=0;i<lines;i++) 
    { 
     for(j=0;j<lines;j++) 
     { 
      fscanf(fp, "%lf", &(m[i][j])); 
     } 
     fscanf(fp, "\n", NULL); 
    } 

    /*print out stored matrix*/ 
    for(i=0;i<lines;i++) 
    { 
     for(j=0;j<lines;j++) 
     { 
      printf("%lf ",m[i][j]); 
     } 
     printf("\n"); 
    } 
} 

Mes problèmes avec cette méthode sont

  1. Il fait l'hypothèse que le nombre de lignes est égal au nombre de doubles par ligne, ce qui peut ne pas être vrai **. Tout doublon manquant dans le fichier provoquera le chargement de la mauvaise matrice dans la mémoire (les valeurs restantes étant décalées de 1)

  2. Je charge actuellement le fichier en mémoire deux fois pour compter les lignes.

Existe-t-il un moyen plus judicieux d'entrer ces données dans un tableau 2D? Je dois m'assurer que la matrice d'entrée est carrée et que mon programme peut gérer une matrice carrée de n'importe quel ordre. Je suis assez nouveau à C, donc les exemples et les fonctions de nommage seront très appréciés :) (Excuses pour l'indentation douteuse)

** Désolé d'être si vague, je voulais un traitement des erreurs, c'est à dire m'assurer que l'entrée est pas accepté à moins qu'il y ait exactement nxn doubles.

+0

Quand vous dites que votre matrice est carrée, alors vous êtes certain que vous recevrez toujours n^2 nombres? Mais vous n'êtes pas sûr si elles sont réparties uniformément le long des lignes? –

+0

Les nombres sont censés être formatés dans l'exemple, et le programme calcule l'inverse de la matrice, donc si la matrice dans le fichier n'est pas carrée alors le programme devrait quitter, car il n'y a plus rien à faire. Les nombres * devraient * être distribués uniformément, mais je veux m'assurer que le programme n'accepte pas tout ce qui n'est pas nxn. Si une ligne a n-1 numéros alors je ne veux pas que le programme traite le nombre manquant comme 0, il devrait se terminer à la place. – Chironex

Répondre

4

Comme Nicolas, je suis curieux de savoir ce que vous voulez dire par le point (1) ... si la matrice est carrée, alors le nombre de lignes ne sera-t-il pas toujours égal au nombre de doubles par ligne? Si non, alors je suppose que vous pourriez regarder à travers le fichier pour la rangée avec le plus de valeurs.

Voici votre code modifié pour le faire:

/* count the number of lines */ 
int lines = 1; 
int maxValues = 0; 
int count = 0; 
char junk; 
while((junk == fgetc(fp)) != EOF) { 
    if(junk == '\n') { 
     lines++ 
     if(maxValues <= count) { 
      maxValues = ++count; 
     } 
     count = 0; 
    } 
    else if(junk == 0x20) { 
     count++; 
    } 
} 

Pour répondre le point (2), peut-être essayer cette modification:

/* load file into array */ 
int i, j; 
for(i = 0; i < lines; i++) { 
    j = 0; 
    do { 
     fscanf(fp, "%lf", &(m[i][j])); 
     j++; 
    } while((junk = fgetc(fp)) != '\n'); 
} 

Enfin pour le point (3), je suis assez sûr vous pouvez utiliser rewind(fp); pour réinitialiser le pointeur au début du fichier.

0
  • lire la première ligne avec fgets
  • compter les valeurs, disons qu'ils sont n
  • faire un tableau de n * n
  • lire n - 1 lignes de n valeurs chaque
  • calculer l'inverse

Voila!

Questions connexes