Bonjour à tous,

j'ai un petit soucis avec mon programme en C qui pourtant semble simple mais me pose vraiment problème (je suis debutant):
je lance:
gcc -o truc.exe truc.c
truc.exe "/essai.csv"

essai.csv contient un tableau de 27 lignes et 17 colonnes que je souhaite charger en mémoire pour faire un traitement ensuite. Certaines cases contiennent des NA, je pense que ça me provoque des erreurs (étant donné que c'est soit un entier soit NA, qui sera surement considéré comme un char ou bien il va me traduire ce qui est en mémoire comme un chiffre, ce qui n'est pas du tout ce que je souhaite!)

Chose importante: ma structure contient 20 champs, mon fichier csv 17: c'est parce que je souhaite remplir ces champs dans la suite de mon programme...

PS: je verrai plus tard pour l'organisation en .h etc.


Voici truc.c :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
 
//truc.c
 
#include<stdio.h>
#include <stdlib.h>
 
typedef struct {
  int n1;
  long int n2; //  peut aller jusque 200000
  int n3;
  int n4;
  int n5;
  int n6;
  int n7;
  int n8;
  int n9;
  int n10;
  int n11;
  int n12;
  int n13;
  int n14; //peut etre NA dans le csv :s ce serait pour ça que ça ne fonctionne pas? (entre autres)
  int n15; //peut etre NA dans le csv
  int n16; //peut etre NA dans le csv
  int n17;
  int n18; //booleen
  int n19; 
  int n20; 
} maStructure;
 
 
//prototype
maStructure * parser(char filename);
 
 
 
/** 
* read the csv file and load it in a C table
* IN: filename
* OUT: data which contains all the lines of the csv file in "maStructure" format
**/
maStructure * parser(char filename){
 
  FILE* file = NULL; //fichier vide
  char buffer[BUFSIZ]; //tableau tampon de taille n  =>ma principale source d'erreur lorsque je compile: je ne vois pas trop quoi lui donner comme taille: chaque ligne peut avoir une taille différente... Je ne sais pas trop comment fabriquer mon buffer pour la suite en fait... :s
  int i = 0;
  file = fopen(filename, "r+");
 
  if (file==NULL) {
    printf("cannot open file %s\n", filename);
    exit(1);
  }
 
  //attribution de l'espace pour les donnees en memoire
  maStructure data = malloc(sizeof(maStructure)*nfile);
 
  printf("loading %s\n", filename); 
  fgets(buffer, bufsiz, file);		// pour lire la ligne header du csv
 
  //tant qu'il existe des lignes à lire
  while (fgets(buffer, sizeof(buffer), file)){
 
    //on stock chaque element de la ligne dans la colonne de data correspondante ==> problème pour le traitement des NA?
    sscanf(buffer, "%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d", 
	  &data[i].n1;
	  &data[i].n2;
      &data[i].n3;
      &data[i].n4;
      &data[i].n5;
      &data[i].n6;
      &data[i].n7;
      &data[i].n8;
      &data[i].n9;
      &data[i].n10;
      &data[i].n11;
      &data[i].n12;
      &data[i].n13;
      &data[i].n14; 
      &data[i].n15;
      &data[i].n16;
      &data[i].n17);
 
&data[i].n18=NULL;
&data[i].n19=NULL; 
&data[i].n20=NULL; 
 
#if (DEBUG > 1)
    printf("%d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d,%d,%d, %d, %d, %d, %d, %d",
      data[i].n1;
      data[i].n2;
      data[i].n3;
      data[i].n4;
      data[i].n5;
      data[i].n6;
      data[i].n7;
      data[i].n8;
      data[i].n9;
      data[i].n10;
      data[i].n11;
      data[i].n12;
      data[i].n13;
      data[i].n14; 
      data[i].n15;
      data[i].n16;
      data[i].n17);  
#endif
    i++;
  }
 
/**
//  while ((c = fgetc (file)) != EOF) {
//    if (c == ';' || c == '\n') {
//        printf ("%ld\n", strtol (buffer, NULL, 10));
//        i = 0;
//        memset (buffer, 0, sizeof buffer);
//      } else {
//      buffer[i++] = c;
//    }
//  }
**/
 
  fclose (file);
 
  return(&data);
} 
 
 
 
 
int main(int argc, char *argv[]) {
  global int nfile = 27; //mauvaise idée de le mettre en globale?
  maStructure * a = parser(*argv[0]);
 
  return(a);
}

Merci par avance!!

(n'hésitez pas à critiquer ma façon de coder, c'est comme ça que l'on apprend! )