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

标签 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() 将整数值分配给数组?

最佳答案

您有很多问题。首先:

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/

相关文章:

在 "perf"事件处捕获用户空间变量

定义中函数标题后的 C 变量声明

c - 程序打印 Windows 路径?

javascript - 为什么我的代码中未定义数组?

java - SimpleAdapter 不在 GUI 上显示数据

java - 如何使用 Java 读取正在写入的文件?

在 C 中计算一个非常高的值

javascript - 遍历嵌套数组对象

java - 从文件返回数组列表

file - Golang 群文件锁定抛出 panic : runtime error: invalid memory address or nil pointer dereference