#arrays #c
Вопрос:
#include <stdio.h>
#include <string.h>
typedef struct arrays {
char air[28];
char water[28];
char land[28];
char c9[28];
char c11[28];
char c13[28];
}arr;
int main()
{
FILE* fp = fopen("ass6file.csv", "r");
if (!fp) {
printf("Can not open file");
return 0;
}
char buff[1024];
int row = 0;
int col = 0;
int i = 0;
arr value[999];
while (fgets(buff, 1024, fp)) {
col = 0;
row ;
if (row == 1)
continue;
char* column = strtok(buff, ",");
while (column) {
if (col == 1)
strcpy(value[i].air, column);
if (col == 2)
strcpy(value[i].water, column);
if (col == 3)
strcpy(value[i].land, column);
if (col == 4)
strcpy(value[i].c9, column);
if (col == 5)
strcpy(value[i].c11, column);
if (col == 6)
strcpy(value[i].c13, column);
column = strtok(NULL, ",");
col ;
}
i ;
}
fclose(fp);
int sum1[28];
/*char sum1=0,sum2=0,sum3=0,sum4=0,sum5=0,sum6=0,k;
int var1,var2,var3,var4,var5,var6;
int m1,m2,m3,m4,m5,m6;
int s1=0,s2=0,s3=0,s4=0,s5=0,s6=0;*/
for (int k = 0; k < 28; k )
sum1[k] = (int)value[k].air;
for (int k = 0; k < 28; k )
printf("%dn", sum1[k]);
return 0;
}
Предупреждение, которое я получаю, это:
filh.c: In function ‘main’:
filh.c:62:11: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
62 | sum1[k]= (int)value[k].air;
|
Я новичок в C. Может ли кто-нибудь помочь напечатать большие числа, которых нет в файле?
Нравится—
1966677344
1966677512
1966677680
1966677848
1966678016
1966678184
1966678352
1966678520
1966678688
1966678856
1966679024
1966679192
1966679360
1966679528
1966679696
1966679864
1966680032
1966680200
1966680368
1966680536
1966680704
1966680872
1966681040
1966681208
1966681376
1966681544
1966681712
1966681880
Комментарии:
1. разберитесь со своими типами правильно.
2. не могли бы вы, пожалуйста, уточнить, уважаемый сэр, я новичок в этом языке и в самом кодировании.
3. приведение работает только для простых типов, таких как int, float.
air
представляет собой массив символов.
Ответ №1:
Вы читаете столбцы из .csv
файла в виде char
массивов.
Но, делая свою сумму, вы [вероятно] захотите преобразовать их в an int
.
Просто приведение их к int
(например, использование (int)
) не сработает.
Когда вы говорите: arr[i].air
это указатель на символьные данные, хранящиеся в air
поле.
По счастливой случайности компилятор отметил это, потому что вы находитесь на 64-разрядной машине, и размер int
переменной составляет 32 бита, а указатель-64 бита
Чтобы преобразовать строковое представление числа в фактическое число (например, нам нужно int
значение), нам нужно использовать функцию atoi
[или strtol
] вместо приведения.
Изменить:
sum1[k] = (int) value[k].air;
В:
sum1[k] = atoi(value[k].air);
Обновить:
я хочу выполнить арифметические операции над элементами массива , найти среднее значение, дисперсию и т. Д. Соответствующих столбцов, файл связан с наукой о данных
Хорошо. Итак, я предполагаю, что все входные данные-это числа. Мы можем провести рефакторинг struct
, чтобы использовать целые числа. Это означает, что мы можем [с помощью atoi
et. al.] хранить данные в виде чисел один раз, а затем работать с ними несколько раз без необходимости их повторного преобразования для каждой операции.
Я предполагаю, что входные значения являются целыми числами. Если некоторые/все из них могут быть дробными (например, 4.37), мы можем определить INPUT_IS_FLOAT
в приведенном ниже примере кода.
ваша программа работает, но она преобразует числа с десятичными дробями в целые числа, которые не дадут мне точных результатов, так как я хочу рассчитать среднее значение и другие вещи, и данные не останутся точными
Это легко решается с помощью переменных с плавающей запятой для суммы, среднего значения, дисперсии и т. Д. Это будет работать независимо от того, хранятся ли входные данные в виде целого числа или числа с плавающей запятой
Вот несколько переработанных кодов для вычисления суммы и среднего значения air
столбца. Вы можете добавить аналогичный код для других полей/столбцов. Или любые значения, которые вам нужно вычислить:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef INPUT_IS_FLOAT
typedef double data_t;
#else
typedef long long data_t;
#endif
typedef struct arrays {
data_t air;
data_t water;
data_t land;
data_t c9;
data_t c11;
data_t c13;
} arr;
int
main()
{
FILE *fp = fopen("ass6file.csv", "r");
if (! fp) {
printf("Can not open file");
return 0;
}
char buff[1024];
int count = 0;
int col;
arr value[999];
arr *acur;
// skip over column headers
fgets(buff, sizeof(buff), fp);
while (fgets(buff, sizeof(buff), fp)) {
acur = amp;value[count ];
col = 0;
char *column = strtok(buff, ",");
while (column) {
#ifdef INPUT_IS_FLOAT
data_t curval = strtod(column,NULL,10);
#else
data_t curval = strtoll(column,NULL,10);
#endif
switch (col) {
case 1:
acur->air = curval;
break;
case 2:
acur->water = curval;
break;
case 3:
acur->land = curval;
break;
case 4:
acur->c9 = curval;
break;
case 5:
acur->c11 = curval;
break;
case 6:
acur->c13 = curval;
break;
}
column = strtok(NULL, ",");
col ;
}
}
fclose(fp);
// sum all 'air' elements
double sum = 0;
for (acur = amp;value[0]; acur < amp;value[count]; acur)
sum = acur->air;
printf("sum of air: %gn",sum);
double mean = sum / count;
printf("mean of air: %gn",mean);
return 0;
}
Комментарии:
1. Это решает вашу непосредственную проблему. Но что ты хочешь сделать? Вы храните данные в
sum1
массиве, но на самом деле не суммируете их. С исправленным кодом вы просто напечатаетеair
значения для каждой записи. Пожалуйста, отредактируйте свой вопрос и опишите подробнее, что вы хотите сделать с данными. После этого вы можете отправить мне комментарий здесь, и я смогу обновить свой ответ, чтобы помочь в дальнейшем.2. Вы справились с ответом на этот вопрос гораздо лучше, чем я, и вам удалось использовать его по счастливой случайности . 1.
3. @AdrianMole На самом деле, я комментировал ваш ответ о
atoi
том, что и другие вещи, которые вы могли бы добавить, но вы слишком быстро нажали на «триггер удаления» 😉4. @CraigEstey я хочу выполнить арифметические операции над элементами массива , найти среднее значение, дисперсию и т. Д. Соответствующих столбцов, файл связан с наукой о данных
5. Я знаю Адриана по предыдущим вопросам на SO [и он очень компетентный программист]. Обладая достаточной привилегией [которой я обладаю], я [все еще] могу видеть его ответ. Он удалил его , потому что он просто исправил код, чтобы избавиться от предупреждения, изменив типы с
int
наintptr_t
, чтобы компилятор не жаловался на приведение. (например) Он изменил две строки:intptr_t sum1[28]; sum1[k] = (intptr_t)value[k].air;
затем он понял, чтоatoi
вместо этого необходимо использовать. Но для него исправить свой ответ было полной перепиской.