繁体   English   中英

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

[英]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的空间来存储不同的数据(每行依次),但是您将指针保存到arraystrings中不同位置的指针。 这将导致您看到的覆盖。 读取时为每个字符串分配存储空间( 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM