如何在链接列表中存储CSV文件的内容?

问题描述 投票:1回答:2

我正在尝试使用C将csv文件中的内容插入到链接列表中。但是,我得到了很多垃圾输出。源代码如下。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct product *customer_head;

struct customer
{
    long long int c_id;//first 6 characters=date & next 6 characters=time & next characters=counter no & city code

    /*Compulsory Fields (Cannot be Skipped)*/
    char name[57];
    long long int ph_no;//10 digit phone number

    /*Non Compulsory Fields (Can be Skipped)*/
    char address[58];
    char city[25];
    char state_code[2];
    char pin[6];
    char email[60];

    struct customer *next;
};
struct customer * load()
{
    FILE * cust=fopen("customer_db.csv","r");
    struct customer *temp,*ptr;
    customer_head=NULL;
    char str[208];
    char *token,*eptr1,*eptr2;
    int line_cnt=0,i=0;

    while(fgets(str,234,cust)!=NULL)
    {
        line_cnt=0;
        i=0;
        ptr=(struct customer *)malloc(sizeof(struct customer));
        for(;str[i];i++)
        {
            if(str[i]=='\n')
            {
                str[i]='\0';
                i=0;
                break;
            }
        }
        token=strtok(str,",");

        while(token!=NULL)
        {

            if(line_cnt==0)
            ptr->c_id=strtoll(token,&eptr1,10);

            else if(line_cnt==1)
            ptr->ph_no=strtoll(token,&eptr2,10);

            else if(line_cnt==2)
            sprintf(ptr->name,"%s",token);

            else if(line_cnt==3)
            sprintf(ptr->address,"%s",token);

            else if(line_cnt==4)
            sprintf(ptr->city,"%s",token);

            else if(line_cnt==5)
            sprintf(ptr->state_code,"%s",token);

            else if(line_cnt==6)
            sprintf(ptr->pin,"%s",token);

            else
            sprintf(ptr->email,"%s",token);

            line_cnt++;

            token=strtok(NULL,",");

        }
        if(customer_head==NULL)
        customer_head=ptr;
        else
        temp->next=ptr;
        temp=ptr;


    }
}
int print(struct customer *h)
{

    while(h->next!=NULL)
    {
        printf("\nCustomer ID: ");
        printf("%lld",h->c_id);
        printf("\nName: ");
        puts(h->name);
        printf("Phone Number: ");
        printf("%lld",h->ph_no);
        printf("\nAddress: ");
        puts(h->address);
        printf("City: ");
        puts(h->city);
        printf("State Code: ");
        puts(h->state_code);
        printf("PIN: ");
        puts(h->pin);
        printf("Email: ");
        puts(h->email);
        h=h->next;
    }
        printf("\nCustomer ID: ");
        printf("%lld",h->c_id);
        printf("\nName: ");
        puts(h->name);
        printf("Phone Number: ");
        printf("%ld",h->ph_no);
        printf("\nAddress: ");
        puts(h->address);
        printf("City: ");
        puts(h->city);
        printf("State Code: ");
        puts(h->state_code);
        printf("PIN: ");
        puts(h->pin);
        printf("Email: ");
        puts(h->email);

    return 1;
}
int main()
{
    load();
    print(customer_head);
}

我还在这里附加csv文件。为了使程序更简单,我从csv文件中删除了标题。它们按顺序

客户ID,电话号码,名称,地址,城市,州代码,PIN,电子邮件

1403201156540201,2226179183,Katherine_Hamilton,87_Thompson_St.,Fremont,IA,502645,[email protected]
2204201532220103,8023631298,Marc_Knight,-,-,-,-,-
0305201423120305,8025595163,Albie_Rowland,-,Hamburg,NY,140752,-
0607201232220901,4055218053,Grant_Phelps,-,-,-,-,-

破折号(-)表示这些字段应保持为空。

输出如下:

Customer ID: 1403201156540201
Name: Katherine_Hamilton
Phone Number: 2226179183
Address: 87_Thompson_St.
City: Fremont
State Code: [email protected]
PIN: [email protected]
Email: [email protected]

Customer ID: 2204201532220103
Name: Marc_Knight
Phone Number: 8023631298
Address: -
City: -
State Code: -
PIN: -
Email: -

Customer ID: 305201423120305
Name: Albie_Rowland
Phone Number: 8025595163
Address: -
City: Hamburg
State Code: NY140752-
PIN: 140752-
Email: -

Customer ID: 607201232220901
Name: Grant_Phelps
Phone Number: 4055218053
Address: -
City: -
State Code: -
PIN: -
Email: -

您可以看到,内容在很多地方都已合并。我不明白为什么。

c csv file linked-list fopen
2个回答
1
投票

由于注释,您知道字符数组的声明受one-too-few


0
投票
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
enum operations {EXIT, ADD_BOOK, ISSUE_BOOK, RETURN_BOOK, DISPLAY_BOOKS,
                SORT_BOOKS, DISPLAY_BOOK_SUBJECTWISE};
typedef enum operations MENU;
typedef struct book
{
    int bookId;
    char bookName[30];
    char subject[30];
    char author[30];
    float price;
}BOOK;
typedef struct node
{
    struct node *prev;
    BOOK info;
    struct node *next;
}NODE;
NODE *head=NULL;
NODE *issuehead=NULL;
static int counter=0;
MENU menu_function()
{
    int choice;
    printf(" 1. Add Book\n");
    printf(" 2. Issue Book\n");
    printf(" 3. Return Book\n");
    printf(" 4. Display Book\n");
    printf(" 5. Sort Book\n");
    printf(" 6. Display Books Subject-wise\n");
    printf(" 0. EXIT\n");
    printf(" Enter your choice::");
    scanf("%d",&choice);
    if(choice < 0 || choice > 6)
    {
        printf(" Error: Enter valid choice\n");
    }
    return choice;
}
void FreeList()
{
    while(CountNodes(head))
    {
        DeleteBook();
    }
    while(CountNodes(issuehead))
    {
        DeleteIssues();
    }
}
int CountNodes(NODE *trav)
{
    int count=0;
    while(trav!=NULL)
    {
        count++;
        trav=trav->next;
    }
    return count;
}
void DeleteBook()
{
    NODE *temp=head;
    head = head->next;
    free(temp);
    temp=NULL;
}
void DeleteIssues()
{
    NODE *temp=issuehead;
    issuehead = issuehead->next;
    free(temp);
    temp=NULL;
}
void AcceptData(BOOK *book)
{
    book->bookId=++counter;
    getchar();
    printf(" Enter Book name::");
    scanf("%[^\n]s",&book->bookName);
    getchar();
    printf(" Enter Subject::");
    scanf("%[^\n]s",&book->subject);
    getchar();
    printf(" Enter author::");
    scanf("%[^\n]s",&book->author);
    printf(" Enter price::");
    scanf("%f",&book->price);
}
void DisplayData(BOOK book)
{
    printf(" %d\t\t",book.bookId);
    printf(" %s\t\t",book.bookName);
    printf(" %s\t\t",book.subject);
    printf(" %s\t\t",book.author);
    printf(" %g\n",book.price);
}
NODE *CreateNode()
{
    NODE *temp;
    temp = (NODE *) malloc(sizeof(NODE));
    temp->next=NULL;
    temp->prev=NULL;
    return temp;
}
void AddtoBooklist(BOOK book)
{
    NODE *new_node;
    new_node=CreateNode();
    new_node->info=book;
    if(head == NULL)
    {
        head=new_node;
    }
    else
    {
        new_node->next=head;
        head->prev=new_node;
        head=new_node;
    }
}
void DisplayBooks(NODE *trav)
{
    if(trav==NULL)
    {
        printf(" Book list is empty...\n");
    }
    else
    {
        printf(" Available Books\n");
        while(trav!=NULL)
        {
            DisplayData(trav->info);
            trav=trav->next;
        }
        printf("\n");
    }
}
void IssueBook()
{
    NODE *trav=head, *prev=NULL;
    NODE *temp, *right;
    int bookId;
    printf(" Enter Book ID::");
    scanf("%d",&bookId);
    while(bookId != trav->info.bookId)
    {
        prev=trav;
        trav=trav->next;
        if(trav==NULL)
        {
            printf(" Book not found...\n");
            break;
        }
    }
    if(trav==head)
    {
        temp = trav;
        head->prev=NULL;
        head = head->next;
        trav=NULL;
        IssueAtFirst(temp);
        printf(" Book issued successfully...\n");
    }
    else if(trav->next==NULL)
    {
        temp=trav;
        prev->next=NULL;
        trav->prev=NULL;
        trav=NULL;
        IssueAtFirst(temp);
        printf(" Book issued successfully...\n");
    }
    else
    {
        temp=trav;
        right=trav->next;
        prev->next=right;
        right->prev=prev;
        trav->next=NULL;
        trav->prev=NULL;
        trav=NULL;
        IssueAtFirst(temp);
        printf(" Book issued successfully...\n");
    }
}
void IssueAtFirst(NODE *temp)
{
    if(issuehead == NULL)
    {
        issuehead=temp;
        temp->next=NULL;
        temp->prev=NULL;
        temp=NULL;
    }
    else
    {
        temp->next=issuehead;
        temp->prev=NULL;
        issuehead=temp;
        temp=NULL;
    }
}
void ReturnBook()
{
    NODE *trav=issuehead, *prev=NULL;
    NODE *temp, *right;
    int bookId;
    printf(" Enter Book ID::");
    scanf("%d",&bookId);
    while(bookId != trav->info.bookId)
    {
        prev=trav;
        trav=trav->next;
        if(trav==NULL)
        {
            printf(" Book not found...\n");
            break;
        }
    }
    if(trav==issuehead)
    {
        temp = trav;
        issuehead->prev = NULL;
        issuehead = issuehead->next;
        trav=NULL;
        ReturnAtFirst(temp);
        printf(" Book returned successfully...\n");
    }
    else if(trav->next==NULL)
    {
        temp=trav;
        prev->next=NULL;
        trav->prev=NULL;
        trav=NULL;
        ReturnAtFirst(temp);
        printf(" Book returned successfully...\n");
    }
    else
    {
        temp=trav;
        right=trav->next;
        prev->next=right;
        right->prev=prev;
        trav->next=NULL;
        trav->prev=NULL;
        trav=NULL;
        ReturnAtFirst(temp);
        printf(" Book returned successfully...\n");
    }
}
void ReturnAtFirst(NODE *temp)
{
    if(head == NULL)
    {
        head=temp;
        temp->next=NULL;
        temp->prev=NULL;
        temp=NULL;
    }
    else
    {
        head->prev=temp;
        temp->next=head;
        temp->prev=NULL;
        head=temp;
        temp=NULL;
    }
}
void SortBooks()
{
    NODE *trav=head,*right=head->next;
    BOOK temp;
    while(trav->next!=NULL)
    {
        right=trav->next;
        while(right!=NULL)
        {
            if(trav->info.bookId > right->info.bookId)
            {
                temp = trav->info;
                trav->info = right->info;
                right->info = temp;
            }
            right=right->next;
        }
        trav=trav->next;
    }
}
void AddBooksToFile()
{
    NODE *trav=head;
    FILE *fp;
    fp=fopen("Booklist.dat","wb");
    if(fp!=NULL)
    {
        while(trav!=NULL)
        {
            fwrite(&trav->info, sizeof(BOOK),1,fp);
            trav=trav->next;
        }
    }
    fclose(fp);
}
void AddIssuesToFile()
{
    NODE *trav=issuehead;
    FILE *fp=issuehead;
    fp=fopen("Issuelist.dat","wb");
    if(fp!=NULL)
    {
        while(trav!=NULL)
        {
            fwrite(&trav->info, sizeof(BOOK),1,fp);
            trav=trav->next;
        }
    }
    fclose(fp);
}
void ReadIssuesFromFile()
{
    BOOK book;
    FILE *fp;
    fp=fopen("Issuelist.dat","rb");
    if(fp!=NULL)
    {
        while((fread(&book,sizeof(BOOK),1,fp))!=0)
        {
            AddtoIssuelist(book);
        }
    }
    fclose(fp);
}
void ReadBooksFromFile()
{
    BOOK book;
    FILE *fp;
    fp=fopen("Booklist.dat","rb");
    if(fp!=NULL)
    {
        while((fread(&book,sizeof(BOOK),1,fp))!=0)
        {
            AddtoBooklist(book);
        }
    }
    fclose(fp);
}
void AddtoIssuelist(BOOK book)
{
    NODE *new_node;
    new_node=CreateNode();
    new_node->info=book;
    if(issuehead == NULL)
    {
        issuehead=new_node;
    }
    else
    {
        new_node->next=issuehead;
        issuehead->prev=new_node;
        issuehead=new_node;
    }
}
void DisplaySubjectWise(NODE *head)
{
    NODE *trav=head;
    char subject[30];
    printf(" Enter subject::");
    scanf("%s",&subject);
    while(trav!=NULL)
    {
        if(stricmp(subject, trav->info.subject)== 0)
        {
            DisplayData(trav->info);
        }
        trav=trav->next;
    }
}
int main()
{
    MENU choice;
    int data;
    BOOK book;
    ReadBooksFromFile();
    ReadIssuesFromFile();
    while((choice=menu_function())!=EXIT)
    {
        switch(choice)
        {
        case ADD_BOOK:
            AcceptData(&book);
            AddtoBooklist(book);
            printf(" Book added to library successfully...\n");
            break;
        case ISSUE_BOOK:
            if(head==NULL)
            {
                printf(" No Books are available now...\n");
                break;
            }
            else
            {
                IssueBook();
            }
            break;
        case RETURN_BOOK:
            if(issuehead==NULL)
            {
                printf(" No Books are issued...\n");
                break;
            }
            else
            {
                ReturnBook();
            }
            break;
        case DISPLAY_BOOKS:
            DisplayBooks(head);
            DisplayBooks(issuehead);
            printf("\n");
            break;
        case SORT_BOOKS:
            if(head==NULL)
            {
                printf(" No Books to sort...\n");
                break;
            }
            SortBooks();
            break;
        case DISPLAY_BOOK_SUBJECTWISE:
            if(head==NULL)
            {
                printf(" No Books to display...\n");
                break;
            }
            DisplaySubjectWise(head);
            break;
        }
    }
    AddBooksToFile();
    AddIssuesToFile();
    FreeList();
    return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.