我正在尝试编写一个简单的程序,该程序将允许用户在指定要提取哪些行和列之后从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()语句。这种临时变量方法是可行的还是有一种更清洁的方法来解决?我并不需要代码来解决此问题,并且对将我定向到学习资源的答案感到非常满意。
谢谢
答案 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`.