2014-01-24 77 views
0

下面而INT值是無用值僅正確顯示char值給出的代碼...不能存儲用C整數值

#include<stdio.h> 
#include<conio.h> 
#include<alloc.h> 

typedef struct 
{ 
    char name[10]; 
    char age[10]; 
}stu; 

void main() { 
    FILE *fp=fopen("Demo.bin","wb"); 
    FILE *fr=fopen("Demo.bin","rb"); 
    stu *ptr; 
    int n,i; 

    printf("\n How many elements???"); 
    scanf("%d",&n); 
    ptr=(stu *)malloc(sizeof(stu)*n); 
    i=0; 

    while(i<n) 
    { 
     scanf("%s%d",ptr->name,ptr->age); 
     fseek(fp,sizeof(ptr)*i,SEEK_SET); 
     fwrite(ptr,sizeof(ptr),1,fp); 
     i++; 
    } 
    fclose(fp); 
    i=0; 

    while(i<n) 
    { 
     fseek(fr,sizeof(ptr)*i,SEEK_SET); 
     fread(ptr,sizeof(ptr),1,fr); 
     printf("%s%d",ptr->name,ptr->age); 
     i++; 
    } 
    free(ptr); 

    fclose(fr); 
    getch(); 

} 

代碼生成具有正確的字符串值的輸出但垃圾整數值。

+2

這是因爲當它在結構中的數據類型是'char [10]',即一個十個字母的字符串時,將年齡當作'int'對待。 –

+1

難道你沒有得到警告嗎?'%d'需要類型'int *'的參數,但參數的類型是'char *' – sujin

回答

1

您不能在字符數組上調用%d。您必須首先將字符數組轉換爲整數,或者您可以將其打印爲與%s一樣的字符串,就像您對該人的姓名所做的那樣。

0
#include <stdio.h> 
#include <stdlib.h> //! 
#include <conio.h> 

typedef struct { 
    char name[10]; 
    int age; //! 
} stu; 

int main(){ //! 
    FILE *fp=fopen("Demo.bin","wb"); 
    FILE *fr; //! 
    stu *ptr; 
    int n,i; 

    printf("\n How many elements???"); 
    scanf("%d", &n); 
    ptr=malloc(sizeof(stu)*n); 
    i=0; 
    while(i<n){ 
     scanf("%s %d", ptr[i].name, &ptr[i].age); //! 
     fwrite(&ptr[i++], sizeof(*ptr), 1, fp); //! 
    } 
    fclose(fp); 
    //memset(ptr, 0, n*sizeof(*ptr)); //! 
    free(ptr); //! 
    ptr=malloc(sizeof(stu)*n); //! 
    fr=fopen("Demo.bin","rb"); //! 
    i=0; 
    while(i<n){ 
     fread(&ptr[i], sizeof(*ptr), 1, fr); //! 
     printf("%s %d\n", ptr[i].name, ptr[i].age); //! 
     ++i; 
    } 
    free(ptr); 
    fclose(fr); 
    getch(); 
    return 0; 
} 
+0

您能否用註釋標記您對OP代碼所做的更改?這將有所幫助。 –

0

您的代碼讀取chararter arrayinteger。你的編譯器可能會給出警告

與下面的示例代碼相同。

#include <stdio.h> 
int main() 
{ 
    char age[10]; 
    scanf("%d", age); 
    printf("out : %d\n", age); 
} 

編譯後:

warning: format ‘%d’ expects argument of type ‘int *’, but argument 2 has type ‘char *’ [-Wformat] 
warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘char *’ [-Wformat] 

OUTPUT:

23 
out : -1073788814 

因此改變你的焦炭年齡[10]INT年齡您的代碼將正常工作。

typedef struct 
{ 
     char name[10]; 
     int age; 
}stu;