[英]C - Loading data from a file in an array
好的,到目前为止,我正在C语言中工作,stackoverflow一直在为我提供很多帮助,但是我仍然陷于困境! 我不确定为什么这行不通! 我正在尝试将标记化的文件存储在数组中,但是这似乎不起作用,这是我正在尝试的内容:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(int argc, const char * argv[])
{
int lines=0, i=0, a=0;
char strings[50], *err=" ";
FILE *file;
char *array[100][4];
file=fopen("inventory.csv", "a+");
if(file==NULL){
return 1;}
err=malloc(100);
while(a<100 && fgets(strings, sizeof strings, file)!=NULL){
int i;
char *p;
i = 0;
p = strtok (strings,",");
while (i<4 && p != NULL)
{
array[a][i++] = strdup(p);
p = strtok (NULL, ",");
}
a++;
}
lines=a;
if(argv[1]!=NULL){
if(strcmp(argv[1], "list")==0){
printf("\nName, Quantity, Reorder limit, Cost\n\n");
for(a=0;a<lines;a++){
for(i=0;i<4;i++){
printf("%s ", array[a][i]);
}
printf("\n");
}
printf("\n");
}
else if(strcmp(argv[1], "reorder")==0){
int i=0;
printf("We need to purchase more of the following items: \n");
for(i=0;i<lines;i++){
if(strtod(array[i][1], &err)<=strtod(array[i][2],&err)){
printf("%s\n", array[i][0]);
}
}
}
else if(strcmp(argv[1], "deduct")==0){
if(argv[2]){
int i=0;
char str[100];
for(i=0;i<lines;i++){
if(strcmp(argv[2], array[i][0])==0){
if(strtod(array[i][1],&err)-1>0){
sprintf(str,"%f",strtod(array[i][1],&err)-1);
array[i][1]=str;
printf("Success\n");
fseek(file, 0, 1);
sprintf(str,"%s,%s,%s,%s", array[i][0], array[i][1], array[i][2], array[i][3]);
fwrite(str,1,sizeof(str+1),file);
}
else{
printf("There are none left!\n");
}
}
}
}
else{
printf("Enter a food item");
}
}
else if(strcmp(argv[1], "add")==0){
fseek(file, 0, 2);
char str[100];
sprintf(str,"%s,%s,%s,%s\n",argv[2],argv[3],argv[4],argv[5]);
fwrite(str,1,sizeof(str),file);
}
else{
printf("Please enter an argument: list, reorder, deduct _name_, add _name_ _qty_ _reorderlimit_ _price_\n");
}
}
int j;
for(i=0;i<lines;i++){
for(j=0; j<3; j++){
free(array[i][j]);
}
}
fclose(file);
return 0;
}
我已经修复了列表并添加了功能,但是,每次运行后我仍然会收到核心转储,并且扣除不起作用(例如,成功执行核心转储,但是不更新文件),并且individulaAverage仍然找不到输入(名称)为实验(i)==;
这是csv文件:
hotdog,10,2,1.5
bun,10,2,0.5
burger,100,10,2.0
cheese,100,10,2.25
pickle,10,2,1.0
ham,2,2,1.0
salmon,5,1,5.0
steak,5,1,7.0
pork,10,2,6.0
fries,1000,100,3.0
您一直在重复使用strings
的空间来存储不同的数据(每行依次),但是您将指针保存到array
中strings
中不同位置的指针。 这将导致您看到的覆盖。 读取时为每个字符串分配存储空间( strdup()
?-POSIX的一部分,但不在Standard C中)。 然后记住释放分配的空间。
您能解释一下strdup()的作用以及在这种情况下如何使用它吗?
char *strdup(const char *str)
{
size_t len = strlen(str) + 1;
char *dup = malloc(len);
if (dup != 0)
memmove(dup, str, len);
return dup;
}
函数strdup()
通过为字符串的副本分配足够的内存来复制字符串(记住字符串的末尾有一个零字节),如果分配成功,则将原始字符串复制到新的字符串。 无论如何,它将返回重复的指针(空或有效值)。
您将替换array[a][i++] = p;
与array[a][i++] = strdup(p);
您还需要一个类似于以下内容的循环:
for (int i = 0; i < lines; i++)
{
for (int j = 0; j < 3; j++)
free(a[i][j]);
}
(当然,如果立即退出,循环将变为可选,但是确保您知道执行的每个显式或隐式malloc()
都有free()
位置和时间是一个很好的主意。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.