我想从.csv文件中获取数值并将其存储在数组中。我的尝试可以在这里看到:
FILE *ifp;
ifp = fopen(DIREC,"r");
if(ifp == NULL){
fprintf(stderr,"Input file not read.\n");
exit(1);
}
int rows = 0;
int columns = 0;
rows = readParts(ifp);
fseek(ifp, 0, SEEK_SET);
columns = readConfigs(ifp);
fseek(ifp, 0, SEEK_SET);
char arr[rows][columns];
arr[rows][columns] = malloc(sizeof(int)*rows*columns);
for (int i=0; i < rows; ++i){
while(!feof(ifp)){
int count = 0;
int c = fgetc(ifp);
if(c == '\n'){
break;
}
if(isdigit(c)){
arr[i][count] = c;
count++;
}
}
}
printf("First entry: %d", arr[0][0]);
fclose(ifp);
但是,在使用fgetc()
读取整数值时遇到问题。我知道它在抓取数字,因为printf("%c",c);
返回正确的结果。但是,将c
分配给arr
时,我没有分配正确的值,因为fgetc()
不会返回实际的字符值。我尝试投射(int) c
,但它没有任何改变。我已经研究过fnscanf()
,但是由于我的.csv文件还包含非数字,因此我不确定这将如何工作。是否有使用fgetc()
将整数值分配给数组的正确方法?
答案 0 :(得分:1)
您遇到许多问题。首先:
rows = readParts(ifp);
fseek(ifp, 0, SEEK_SET); /* rewinds to beginning */
columns = readConfigs(ifp); /* re-reads rows values as columns */
fseek(ifp, 0, SEEK_SET); /* rewinds to beginning -- again */
摆脱fseek(ifp, 0, SEEK_SET);
调用,只剩下:
rows = readParts(ifp);
columns = readConfigs(ifp);
下一步:
char arr[rows][columns];
声明一个可变长度数组,存储空间已完全保留,不需要分配。如果要动态分配,则必须声明rows
个指针,然后声明每个指针columns
个int
。 (您也可以声明指向int (*)[columns]
的VLA的指针,但是由于columns
不是编译时常量,因此不建议这样做)。删除arr[rows][columns] = malloc(sizeof(int)*rows*columns);
接下来要将文件读入数组,只需保留正确的r
(行)和c
(列)计数器,然后使用fscanf (ifp, "%d", &arr[r][c])
读取文件中的每个整数(或使用fgets()
读取行到缓冲区的行,然后使用sscanf
来解析行中的值
例如:
int r = 0, c = 0;
while (fscanf (ifp, "%d", &arr[r][c++]) == 1) {
/* check if row full */
if (c == columns) {
r++; /* advance row count */
if (r == rows) /* protect arr bounds */
break;
c = 0; /* reset column count zero */
}
}
(注意:,您提到.csv
,但未从文件中提供任何示例输入。如果文件实际上是逗号分隔,则需要在循环中读取的每个整数之后,将读取指针向前移动经过逗号(或直到找到'\n'
或EOF
为止)
这时,您已经用文件中的每个整数值填充了数组,并确保将每个存储的行/列值保持在arr
的范围内。
如果您还有其他问题,请告诉我。