我想从 .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()
将整数值分配给数组?
最佳答案
您有很多问题。首先:
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
的范围内。 .
如果您还有其他问题,请告诉我。
关于c - 使用 fgetc() 将文件中的整数值分配给数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56798604/