首先,我使用我的C文件Cars.csv
打开一个CSV文件(cars.c
)。我的CSV文件如下所示:
toyota, 100, 20, 150.50
nissan, 200, 50, 100.75
BMW, 400, 80, 323.00
第1栏是名称,第2栏是库存,第3栏是订单,第4栏是价格。
然后我必须完成两项工作(我将在命令行中调用程序,其中包含工作名称和我需要传递的任何其他参数):
列出CSV文件中的所有项目,而逗号不能作为输出的一部分。我还必须为每列打印标题。 (./cars list)
从命令行运行程序时,我会发送一个参数。参数将是我的csv文件中项目的名称。然后我必须从库存中减去1并更新CSV文件。 (./cars减少日产)
这是我打开CSV文件的方式。
void main(int argc, char *argv[]) {
FILE *in = fopen ("Cars.csv" ,"rt");
if (in == NULL) {
fclose (in); return 0;
}
//我需要将CSV文件中的数据存储在指针数组中。我知道该怎么做,但我在没有逗号的情况下存储它们时遇到问题,然后在第1部分做我需要做的事。
//这是我能为第二部分编写的唯一代码。
int p =0;
for(p =0; p<; p = p + 4) {
if(strcmp(argsv[2],save[p]) == 0) { //save is the array of pointers where I
int r = int(save[p +1]); //store the data from the csv file
int s = r - 1;
char str[15];
sprintf(str, "%d", s);
save[p +1] = str; // not sure if this line actually makes sense
}
}
答案 0 :(得分:2)
有几种可能的解决方案。
这是一个:
将行读入指针数组。使用malloc
分配数组,并根据需要使用realloc
重新分配。使用fgets
读取行。
对于每一行,使用strtok
分割行,并为每个字段执行所需操作。
另一种解决方案:
使用您最喜欢的搜索引擎搜索现有的CSV阅读库(有很多可以处理非常高级的CSV文件)。
答案 1 :(得分:0)
考虑如何表示数据并定义结构。
typedef struct {
char *name;
int stock;
int order;
double price;
} car_type;
打开文件:参见OP的代码
查找多少行并分配内存
char buf[100];
size_t n = 0;
while (fgets(buf, sizeof buf, in) != NULL) n++;
rewind(in);
car_type *car = malloc(n * sizeof *car);
if (car == NULL) OutOfMemory();
阅读汽车
for (size_t i=0; i<n; i++) {
if (fgets(buf, sizeof buf, in) == NULL) Handle_UnexpectedEOF();
char car_name[100];
if (4 != sscanf(buf, "%s ,%d ,%d, %lf", car_name,
&car[i].stock, &car[i].order, &car[i].price) Handle_FormatError();
car[i].name = strdup(car_name);
}
// Use `car` ...
完成后
fclose(in);
for (size_t i=0; i<n; i++) {
free(car[i].name);
}
free(car);