2012-11-28 41 views
0

試圖讀取/寫入二進制文件失敗後,我試圖用fscanf和fprintf做同樣的事情,它似乎工作正常,但再次..閱讀根本不工作,我可以再次「噸真的知道爲什麼:C fscanf和指針

結構+指針:

typedef struct flug 
{ 
    int   flugnummer; 
    char  flugziel[50]; 
    enum TAG flugtag; 
    int   flugzeit_stunde; 
    int   flugzeit_minute; 
    int   gateway; 
    char  status[10]; 
    struct flug *next; 
}FLUG; 

typedef FLUG *ELEM_ZGR; 

全局變量:

enum TAG { 
Sonntag, 
Montag, 
Dienstag, 
Mittwoch, 
Donnerstag, 
Freitag, 
Samstag 
}; 

static ELEM_ZGR first; 
char const datei[] = "ddslist.txt"; 

寫:

int fluege_sichern() { 
ELEM_ZGR curr; 
FILE *fp; 

curr = first; 

    if (fopen_s(&fp, datei,"a+") != 0) 
    { 
     printf("\nDatei %s nicht zum Anhaengen zu oeffnen",datei); 
     PAUSE; 
     exit(1); 
    } 

    while (curr != NULL) { 
     fprintf(fp,"%d %s %d %d %d ", 
      curr->flugnummer, curr->flugziel, curr->flugzeit_stunde, curr->flugzeit_minute, curr->gateway); 
     fclose(fp); 

     curr = curr->next; 
    } 

} 

讀:

void fluege_laden() { 
ELEM_ZGR curr; 
FILE *fp; 

int i = 0; 
curr = NULL; 

    if (fopen_s(&fp, datei,"r") != 0) 
    { 
     printf("\nDatei %s nicht zum Lesen zu oeffnen",datei); 
     PAUSE; 
     exit(1); 
    } 

    printf("\n\nArtikelliste\nArtikelnummer Artikelbezeichnung Artikelpreis"); 

    while (fscanf_s(fp,"%d %s %d %d %d ", 
      &curr->flugnummer, curr->flugziel, &curr->flugzeit_stunde, &curr->flugzeit_minute, &curr->gateway) != EOF) 
    { 
      printf("\n%d %s %d %d %d ", 
      curr->flugnummer, curr->flugziel, curr->flugzeit_stunde, curr->flugzeit_minute, curr->gateway); 
      if (++i%10==0) 
       PAUSE; 
    } 

    fclose(fp); 
} 

請幫我在這裏。即使有一點暗示也會有很大的幫助。 [EDIT1]

void fluege_laden() { 
ELEM_ZGR curr; 
FILE *fp; 

int i = 0; 
curr = (ELEM_ZGR)malloc(sizeof(struct flug)); 

    if (fopen_s(&fp, datei,"r") != 0) 
    { 
     printf("\nDatei %s nicht zum Lesen zu oeffnen",datei); 
     PAUSE; 
     exit(1); 
    } 

    printf("\n\nArtikelliste\nArtikelnummer Artikelbezeichnung Artikelpreis"); 

    while (fscanf_s(fp,"%d %s %d %d %d ", 
      &curr->flugnummer, curr->flugziel, &curr->flugzeit_stunde, &curr->flugzeit_minute, &curr->gateway) != EOF) 
    { 
      printf("\n%d %s %d %d %d ", 
      curr->flugnummer, curr->flugziel, curr->flugzeit_stunde, curr->flugzeit_minute, curr->gateway); 
      if (++i%10==0) 
       PAUSE; 
    } 

    fclose(fp); 
} 
+0

我建議對函數使用有用的參數(而不是依賴於全局變量),並讓它們返回有用的值。並且:請不要鍵入指針。它只會讓你和其他人感到困惑。 (一個'*'對於經驗豐富的眼睛而言是非常可讀的,而不是FLUGZEUG_ANZEIGER_TYP; – wildplasser

+0

一旦應用程序按預期工作,我就會這樣做;; – OhSnap

回答

1

查找:

void fluege_laden() { 
    ELEM_ZGR curr; 
    FILE *fp; 

    int i = 0; 
    curr = NULL; /* NULL! */ 

加載時,currNULL。您不能寫入NULL指針,這是未定義的行爲。你需要分配內存。

另外,還要考慮包括在typedef指針,這是很難理解和記住ELEM_ZGR是一個指針。指針語義在C語言中很重要,最好向代碼的所有讀者講清楚發生了什麼。

+0

呃..好吧,我明白了,但我不知道如何解決它。 curr =第一個似乎也沒有幫助。 – OhSnap

+0

什麼是第一個?它是在什麼地方定義的?是否初始化?它指向一些有用的東西嗎? – wildplasser

+0

對不起,我沒有真正把它放在第一篇文章。這是一個全局靜態變量(將編輯第一篇文章並將其放在那裏),但是......最後它也是空的。我該怎麼做呢?我通常在vb.net編程,看起來好像更容易處理。 – OhSnap

0

在你讀功能curr是一個typedef到FLUG *,你初始化它作爲NULL

curr = NULL; 

然後您嘗試訪問尊重它在你的fscanf

while (fscanf_s(fp,"%d %s %d %d %d ", &curr->flugnummer,... 

那沒好。如果你有一個指針,你要的東西存儲,你需要給它一些內存:

curr = malloc(sizeof(FLUG)); 

那麼你應該能夠使用它。完成之後,您需要撥打free(curr)以釋放該內存。

+0

呵呵..是啊,我忘了那個,但它仍然不起作用。我要更新最初的帖子.. – OhSnap