Первое, что вам нужно сделать, если вы хотите прочитать значения 144
, это отправить значения 144
для преобразования. Ваши данные содержат только 138
:
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,72,89,110,127,160,192,253,316,352,360,522,539,601,598,770,582,650,810,741,805,894,908,864,904,962,1016,1106,1853,1503,1311,1406,1444,1401,1409,1344,1622,1472,1382,1609,1766,3310,3093,2041,1496,2068,3302,3185,1358,2760,2715,1285,994,1086,832,871,813,1707,1218,1218,239,203,170,132,70,53,45,39,39,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
У вас есть много вариантов преобразования данных csv в числа. strtok
, strsep
или лично мой выбор strtol
. Причина в том, что для числового преобразования strtol
(и родственные функции) обеспечивают наибольшую степень сообщения об ошибках при сбое преобразования.
Поскольку strtol (const char *nptr, char **endptr, int base);
использует указатель на преобразуемые цифры (nptr
) и обновляет конечный указатель (endptr
), указывающий на следующий символ после только что преобразованного числа, он идеально подходит для перехода по строке цифр, разделенных любой разделитель и преобразование всех значений в числа.
Ниже приведен лишь краткий пример того, как вы можете использовать его для преобразования данных "HourPower" в отдельные целые числа, содержащиеся в массиве. Для примера ваши значения просто считываются из stdin
. Я предоставил свободную проверку ошибок только для того, чтобы поймать некоторые из основных ошибок, которые в противном случае привели бы к записи за пределы вашего массива и т. д. Это примеры проверок ошибок, которые не претендуют на то, чтобы быть исчерпывающими.
Просмотрите его и дайте мне знать, если у вас есть вопросы:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <errno.h>
#define NDATA 160
#define MAXC 1024
long xstrtol (char *p, char **ep, int base);
int main (void) {
char line[MAXC] = {0}; /* line buffer for fgets */
char *p, *ep; /* pointers for strtol */
int array[NDATA] = {0}; /* array of values */
size_t idx = 0, nelem = 0; /* indexes, number of ints */
/* read each line in file */
while (fgets(line, MAXC, stdin))
{
p = ep = line; /* initize pointer/end pointer */
/* convert each csv value to number, store in array */
while (errno == 0)
{
/* skip delimiters/move pointer to next digit */
while (*ep && *ep != '-' && (*ep < '0' || *ep > '9')) ep++;
if (*ep)
p = ep;
else /* break if end of string */
break;
array[idx++] = (int)xstrtol (p, &ep, 10); /* convert */
if (idx == NDATA) { /* NDATA reached, conversion error */
fprintf (stderr, "error: conversion exceeded 144.\n");
return 1;
}
}
if (idx != 144) /* validate 144 values converted */
fprintf (stderr, "warning: invalid conversion of '%zu' values.\n",
idx);
nelem = idx; /* save the final number of values (144) */
}
printf ("\n the converted json values are:\n\n");
for (idx = 0; idx < nelem; idx++) {
printf (" array[%2zu] : %d\n", idx, array[idx]);
}
putchar ('\n');
return 0;
}
/** a simple strtol implementation with error checking.
* any failed conversion will cause program exit. Adjust
* response to failed conversion as required.
*/
long xstrtol (char *p, char **ep, int base)
{
errno = 0;
long tmp = strtol (p, ep, base);
/* Check for various possible errors */
if ((errno == ERANGE && (tmp == LONG_MIN || tmp == LONG_MAX)) ||
(errno != 0 && tmp == 0)) {
perror ("strtol");
exit (EXIT_FAILURE);
}
if (*ep == p) {
fprintf (stderr, "No digits were found\n");
exit (EXIT_FAILURE);
}
return tmp;
}
Пример вывода
$ ./bin/array_json_xstrtol <hpdata.txt
warning: invalid conversion of '138' values.
the converted json values are:
array[ 0] : 0
array[ 1] : 0
array[ 2] : 0
array[ 3] : 0
array[ 4] : 0
array[ 5] : 0
array[ 6] : 0
array[ 7] : 0
array[ 8] : 0
array[ 9] : 0
array[10] : 0
...
array[47] : 59
array[48] : 72
array[49] : 89
array[50] : 110
array[51] : 127
array[52] : 160
array[53] : 192
array[54] : 253
array[55] : 316
array[56] : 352
array[57] : 360
array[58] : 522
array[59] : 539
...
array[130] : 0
array[131] : 0
array[132] : 0
array[133] : 0
array[134] : 0
array[135] : 0
array[136] : 0
array[137] : 0
Где hpdata.txt
содержал данные вашего примера.
person
David C. Rankin
schedule
10.10.2015