2012-01-28 122 views
0

我試圖做一個程序,創建並讀取一個二進制文件,其中包含「結構元素」;你能告訴我我做錯了什麼嗎? 我得到的錯誤告訴我,「s」不是函數fread()中的指針...所以我聲明ELEM * s;而不是ELEM的;fread和fwrite在C

#include <stdio.h> 
#include <stdlib.h> 

typedef struct element{ 
    char name[80]; 
    int p; 
}ELEM; 

void create() 
{ 
    FILE *f; 
    int d=0; 
    char c; 
    ELEM *s; 
    f=fopen("file.bin","wb"); 
    do{ 
    printf("Add elements to file?: (y/n)"); 
    fflush(stdin); 
    scanf("%c",&c); 
    if (c=='y') 
    { 
     printf("Name="); 
     gets((*s).name); 
     printf("P="); 
     scanf("%d",(*s).p); 
     fwrite(s,sizeof(ELEM),1,f); 
    } 
    } while(d==0); 
    fclose(f); 
} 

void show() 
{ 
    FILE *f; 
    ELEM *s; 
    f=fopen("file.bin","rb"); 
    while(feof(f)!=NULL) 
    { 
     fread(s,sizeof(ELEM),1,f); 
     puts((*s).name); 
     printf("\t%d\n",(*s).p); 
    } 
    fclose(f); 
} 

void add() 
{ 
    FILE *f; 
    int d=0; 
    char c; 
    ELEM *s; 
    f=fopen("file.bin","ab"); 
    do{ 
    printf("Add elements to file?: (y/n)"); 
    fflush(stdin); 
    scanf("%c",&c); 
    if (c=='y') 
    { 
     printf("Name="); 
     gets((*s).name); 
     printf("P="); 
     scanf("%d",(*s).p); 
     fwrite(s,sizeof(ELEM),1,f); 
    } 
    } while(d==0); 
    fclose(f); 
} 


/*void function() 
{ 

}*/ 

int main() 
{ 
    int k=0,r; 
    do{ 
     printf("1 - create file\n2 - add elements to fil\n3 - show elements\n4 - put unique elements in another file\n5 - exit program\n"); 
     scanf("%d",&r); 
     switch(r) 
     { 
      case 1 : create(); break; 
      case 2 : add(); break; 
      case 3 : show(); break; 
      case 4 : printf("Function not defined!\n"); break; 
      case 5 : k=1; break; 
      default : printf("Command unrecognized!\n"); 
     } 
    } while(k==0); 
    return 0; 
} 
+0

在旁註:'fflush(stdin)'是絕對錯誤的。另外,'gets()'不能安全使用。請參閱'fgets()'而不是(您可以將它傳遞給stdin)。 – FatalError 2012-01-28 17:34:49

回答

0

的第一個參數傳遞給fwrite應該是一個地址,其地址傳遞必須有足夠的內存來保存你打算閱讀對象的數量變量。

因此,有兩種方式:

對堆棧創建變量:

你堆棧分配的變量,並將其地址傳遞給fwrite

ELEM s; 
fwrite(&s,sizeof(ELEM),1,f); 

動態內存分配:

ELEM *s; 

應分配的內存相當於持有沒有要讀ELEM類型的對象。

ELEM *s = malloc(sizeof *s); 

在這種情況下記得釋放一次與您使用所做的記憶:

free(s); 
+0

謝謝!有用! – user1089723 2012-01-28 17:51:14

3

你聲明的指針,但沒有分配內存給它。你應該恢復到一個正常的變量:

ELEM s; 

/* ... */ 

fwrite(&s,sizeof(ELEM),1,f); 
    ^

另外,在當前的代碼,你應該這樣做:

ELEM *s = calloc(1, sizeof *s); 
+0

謝謝!有用! – user1089723 2012-01-28 17:57:54

0

你是不是在你的create功能分配指針s。你可能想是這樣

s = malloc(sizeof(*s)); 
memset (s, 0, sizeof(*s)); 

而且你真的應該學會與gcc -Wall -g來編譯和使用gdb調試器。

此外,需要時間C.

+0

謝謝!有用! – user1089723 2012-01-28 18:01:19

+0

不要忘記在適當的地方撥打'免費(S);'。使用'valgrind'來確保你的程序不會泄漏太多...... – 2012-01-28 18:13:46

0

好閱讀有關編程的一本好書,你的問題是在scanf函數。scanf函數應該得到一個指針,所以改變(*s).p&(*s).p(甚至&s->p

+0

謝謝!有用! – user1089723 2012-01-28 18:07:25

0

你應該已經分配的指向struct ELEM 假設這是C:

ELEM *s = malloc(sizeof(ELEM)); 

如果是C++只需添加一個投在前面

ELEM *s = (ELEM*) malloc(sizeof(ELEM)); 
+0

謝謝!有用! – user1089723 2012-01-28 18:08:05