fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef struct
  5. {
  6. int count;
  7. int reserved;
  8. double *tab;
  9. } FloatVector;
  10.  
  11. FloatVector *FloatVectorCreate(int reserve)
  12. {
  13. FloatVector *result = (FloatVector *)malloc(sizeof(FloatVector));
  14. if (result)
  15. {
  16. result->tab = (double *)malloc(sizeof(*result->tab) * reserve);
  17. result->count = 0;
  18. result->reserved = reserve;
  19. }
  20. return result;
  21. }
  22.  
  23. void FloatVectorFree(FloatVector *vec)
  24. {
  25. if (vec)
  26. {
  27. free(vec->tab);
  28. free(vec);
  29. }
  30. }
  31.  
  32. void FloatVectorAppend(FloatVector *vec, double x)
  33. {
  34. if (vec->count >= vec->reserved)
  35. {
  36. vec->reserved += 0x10;
  37. vec->tab = realloc(vec->tab, sizeof(*vec->tab) * vec->reserved);
  38. }
  39. vec->tab[vec->count++] = x;
  40. }
  41.  
  42. FloatVector *FloatVectorCreateFormString(const char *line)
  43. {
  44. FloatVector *vec = FloatVectorCreate(0x10);
  45. char *p = (char *)line;
  46. while (1)
  47. {
  48. char *q = p;
  49. double x = strtod(q, &p);
  50. if (p == q)
  51. break;
  52. FloatVectorAppend(vec, x);
  53. }
  54. return vec;
  55. }
  56.  
  57. int ReadCSV(FILE* f, FloatVector ***data)
  58. {
  59. char buffer[0x800];
  60. int reservedDataSize = 0x10;
  61. int dataSize = 0;
  62.  
  63. *data = calloc(reservedDataSize, sizeof(FloatVector *));
  64.  
  65. while (fgets(buffer, sizeof(buffer), f))
  66. {
  67. if (dataSize >= reservedDataSize)
  68. {
  69. reservedDataSize += 0x10;
  70. *data = (FloatVector **)realloc(*data, reservedDataSize * sizeof(FloatVector *));
  71. }
  72. (*data)[dataSize++] = FloatVectorCreateFormString(buffer);
  73. }
  74. return dataSize;
  75. }
  76.  
  77. int main(void) {
  78. FloatVector **data;
  79.  
  80. int size = ReadCSV(stdin, &data);
  81.  
  82. for (int i=0; i<size; ++i)
  83. {
  84. printf("%d\n", data[i]->count);
  85. for (int j=0; j<data[i]->count; ++j)
  86. printf(" %4lg", data[i]->tab[j]);
  87. printf("\n");
  88. }
  89.  
  90. for (int i=0; i<size; ++i)
  91. {
  92. FloatVectorFree(data[i]);
  93. }
  94. free(data);
  95. return 0;
  96. }
  97.  
Success #stdin #stdout 0s 2304KB
stdin
12.3 32.2 322.2
12.3 0.0
0.0
1.1 złe dane 32.2
jeszcze nie koniec 2.2
0.2e-3
stdout
3
 12.3 32.2 322.2
2
 12.3    0
1
    0
1
  1.1
0

1
 0.0002