Saya memiliki file csv ini berisi kontak: nama, nomor, alamat, email Kevin Mahendra, +62 812-XXX-XXX, Jln. Anggrek Merah 3 No. 54, Kevin@gmail.com Adwi Lanang, +62 821-XXX-XXX, Jln. Ruhui Rahayu, ...

0
Kevinkun Official 5 April 2021, 18:31

2 jawaban

Jawaban Terbaik

Bidang terakhir pada setiap baris tidak berhasil oleh koma, jadi Anda harus mencari garis baru sebagai gantinya. Juga untuk mencegah overflow Anda tidak boleh membaca lebih dari satu karakter kurang dari panjang buffer. Ini dapat dicapai dengan trik preprocessor:

#define STR_VALUE(x) STR(x)
#define STR(x) #x

#define MAX 49
#define MAX_STR STR_VALUE(MAX)

typedef struct Contact
{
    char name[MAX + 1];
    char number[MAX + 1];
    char address[MAX + 1];
    char email[MAX + 1];
    struct Contact* next;
}
Contact;
...
fscanf(file,
    "%" MAX_STR "[^,],%" MAX_STR "[^,],%" MAX_STR "[^,],%" MAX_STR "[^\n]",
    new->name, new->number, new->address, new->email);
...

Dalam loop Anda harus berhenti ketika hasil FSCANF (I.E. Jumlah token yang dipindai) adalah nilai lain dari empat.

0
August Karlstrom 5 April 2021, 16:41

Penggunaan feof salah - lihat mengapa (! Feof (file)) "selalu salah?

Selanjutnya, Anda harus selalu memeriksa nilai yang dikembalikan oleh fscanf untuk melihat bahwa Anda telah memindai jumlah elemen yang diharapkan.

Coba sesuatu seperti:

Contact *new = malloc(sizeof(Contact));   // Get a Contact for the first fscanf
if (new == NULL) exit(1);

while(fscanf(file, "%[^,],%[^,],%[^,],%[^,]", new->name, new->number, new->address, new->email) == 4)
{
    
    printf("%s,%s,%s,%s\n", new->name, new->number, new->address, new->email);

    int index = hash(new->name);

    new->next = table[index];
    table[index] = new; 

    Contact *new = malloc(sizeof(Contact));  // Get a Contact for the next fscanf
    if (new == NULL) exit(1);
}

free(new);  // Free the unused Contact
0
4386427 5 April 2021, 16:34