gpt4 book ai didi

C - 从数组中的文件加载数据

转载 作者:行者123 更新时间:2023-11-30 17:37:37 25 4
gpt4 key购买 nike

好吧,我正在用 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 仍然不起作用t 找到输入(名称)== 到实验(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中的空间来存储不同的数据(依次每行),但您将指向数组中strings中不同位置的指针保存。这会导致您看到的覆盖。分配存储(strdup()? — POSIX 的一部分,但不在标准 C 中)对于您阅读的每个字符串。然后记得释放分配的空间。

Could you explain what strdup() does and how to use it in this context?

实现

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()通过为字符串的副本分配足够的内存(记住字符串末尾有一个零字节)来复制字符串,并将原始字符串复制到新字符串如果分配成功则为字符串。不管怎样,它都会返回重复的指针(null 或有效值)。

您可以将 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]);
}

(当然,如果立即退出,循环就变成可选的,但确保您知道每个显式或隐式的 free() 的位置和时间是一个非常好的主意您执行的 malloc()。)

关于C - 从数组中的文件加载数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22340117/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com