2016-03-31 10 views
0

Bir dosyadan, satır satırdan, biçimlendirilmiş bir dizeden ve bağlantılı bir listede saklamayı denemeye çalışıyorum.Bir dosyadan okuyun ve biçimlendirilmiş satırı bağlantılı listeye girin. C

Benim typedef: Ben den okuyorum bir dosyanın

typedef struct s_deck { 
    char name[16]; 
    int atk; 
    int def; 
    int cost; 
    struct s_deck* next; 
} card; 

Örnek:

Line 1: Name 4 4 5 
Line 2: Name2 5 5 5 

Benim işlevi ben böyle bir şey yapmak için uygulamaya çalışıyorum ...

card *LoadDeck() { 
    FILE* file = fopen("text", "r"); 
    if(file == NULL) { 
     printf("unable to open file...\n"); 
    } 
    char line[16]; 
    card* start = NULL; 
    card* newest = NULL; 
    card* previous = NULL; 

    fgets(line, 15, file); 
    card* newCard = malloc(sizeof(card)); 
    sscanf(line, "%s %d %d %d\n", newCard->name, &newCard->atk, 
       &newCard->def, &newCard->cost); 
    printf("Added:%s Attack:%d Defense:%d Cost:%d\n", newCard->name, newCard->atk, 
       newCard->def, newCard->cost); 

    if (start == NULL) { 
     start = LoadDeck(NULL); 
     newest = start; 
    } 
    else { 
     newest = LoadDeck(newest); 
    } 

    if (previous != NULL) { 
     previous->next = newCard; 
    } 
    fclose(file); 
    return newCard; 
} 
Yani yaşıyorum sorunum buna ilk satırı ve sadece ilk satırı okur sonsuz döngü olmasıdır. Elimdeki baskı, onun ne yaptığını görmek ve ... çizgiyi doğru okuyor ama bunu yapmaya devam ediyor ve asla durmuyor. onun düzgün henüz bağlantılı listesi oluşturma eğer

Bilmiyorum. Bu kadar uzaklaşmadım. Sanırım doğru bir şekilde uyguladım, ancak çok zor olan kitaplardan sadece. Burada bazı sorular bulmaya çalıştım ama onların okuduğu dosya benimkinden çok daha karmaşıktır, bu yüzden daha basit bir yol olması gerektiğini düşündüm.

+0

Not. Al, scanf'in ailesinin dönüş değerini kontrol edin. 'if (sscanf (...)! = 4)' –

+0

Giriş dosyası gerçekten 'Satır X: 'önekini içeriyor mu? –

+2

Sorununuza gelince, bir dosyayı açtığınızda, dosya konumu işaretçilerinin başa sıfırlandığını biliyor musunuz? Yineleme yerine bir * döngü * kullanın. –

cevap

1

Eh, ben belki yorumunda bu koymalıyız ama üzgünüm ben bunu yapmak için yeterli bir üne sahip olmadığını biliyorum. Neyse ben program sonsuz döngüler sizin başlangıç ​​ değişken her zaman NULL olduğu için, işlevine ilk çağrı başlangıç ​​== NULL doğru olduğunu bulduktan sonra kendisini aramaya işleve yol açacaktır olduğunu düşünüyorum, sonraki çağrılar daima yol açacaktır sonsuz yineleme çünkü başlangıç ​​her zaman NULL. yazdığın bu çizgiler kara delik geçerli:

if (start == NULL) { 
    start = LoadDeck(NULL); 
    newest = start; } 

Bir şey atamaz başlangıç ​​ değişken, sadece sonsuz özyinelemeye neden olur. Adı "Tank filosunun" devreye girecek müteakip `% d` formatları gibi bir şey ise% s` formatı ilk boşluğa kadar okuma yapar` o

+0

dizesinde boşluklara sahip olmayı düşünürsem çalışmayı deneyeceğim. Bu sonsuz döngü nerede olduğunu anlamama yardımcı oldu – frug