使用fgetc()将文件中的整数值分配给数组

时间:2019-06-27 21:20:24

标签: c arrays file io

我想从.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()将整数值分配给数组的正确方法?

1 个答案:

答案 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个指针,然后声明每个指针columnsint。 (您也可以声明指向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的范围内。

如果您还有其他问题,请告诉我。