如何在C中使用strtok将csv中的后续列分配给数组

时间:2019-06-19 08:29:58

标签: c csv strtok

我正在尝试编写一个简单的程序,该程序将允许用户在指定要提取哪些行和列之后从csv文件提取数据。该程序接受起始行(可以是任何数字,不一定是1)和所需的最后一行的输入。相同的原理适用于色谱柱。然后将输出分配给多维数组,该数组随后将传递给函数进行计算。

我在使用strtok提取不是第一列的列时遇到问题,因为据我了解,strtok必须顺序读取文件?

我一直在用这个项目自学C语言,因此对此原理进行了许多迭代以发展我的知识。我已经成功读取了csv文件,因此我了解了csv文件中strtok的基本原理。

如果我正在使用第一列进行读取,那么我可以像往常一样使用strtok;

"Photos" in my_path

无论如何从第2列开始读取,上面的代码仍必须使用,因为strtok是顺序的,但不必将第0列分配给变量。我唯一可以使用的粗略方法是引入一个临时变量,将所有列放入该变量中,并提取使用所指定的列,但这是不可取的。

var[i][0] = atof(strtok(buf, ","));
var[i][j] = atof(strtok(NULL, ","));

上面的代码不是“为傻瓜证明插入正确的编程字”,但是据我所知,我只为一种情况指定了elseif()语句。这种临时变量方法是可行的还是有一种更清洁的方法来解决?我并不需要代码来解决此问题,并且对将我定向到学习资源的答案感到非常满意。

谢谢

1 个答案:

答案 0 :(得分:0)

对于一些简单的事情,我知道输入文件的格式将正确且没有“空”值,那么我可能会这样做:

float values[rows][columns] = { 0 };  // Initialize all to zero

char line[512];  // Hopefully large enough

unsigned r;  // Row index

// Loop to get all rows, taking care to not go out of bounds
for (r = 0; r < rows && fgets(line, sizeof line, fp) != NULL; ++r)
{
    unsigned c = 0;  // Column index

    // Get the first column value
    char *current = strtok(line, ",");

    // Loop to get all columns
    while (c < columns && current != NULL)
    {
        values[r][c] = atof(current);

        ++c;  // Increase to next column
        current = strtok(NULL, ",");  // Get next (if any) column value
    }
}

// Here the whole file will have been read and parsed, and the values
// from the file will be in the array `values`.