scanf("%d",&s_ptr[i]);虽然字符串格式是 %d,但文件中的结果是 char 值 - 为什么?
scanf("%d",&s_ptr[i]); while string format is %d the result on file is char value - why?
typedef struct info{ //main record
int *id;
unsigned char *name;
}student;
void create(){
student *s_ptr;
int num_of_student,i;
FILE *f_ptr;
f_ptr = fopen("studentdata.txt","w");
printf("**How many student to record**\n");
printf("Enter:");
scanf("%d",&num_of_student);
s_ptr = (student*)calloc(num_of_student,sizeof(student));
for(i=0;i<num_of_student;i++){
printf("Enter student id: ");
scanf("%d",&s_ptr[i]);//while string format is %d it prints char value to the file.
fflush(stdin);
printf("Enter student full name: ");
scanf("%[^\n]",&(s_ptr+i)->name);
fwrite(s_ptr+i,sizeof(struct info),1,f_ptr);
}
}
scanf("**%d**",&s_ptr[i])
打印其在文件中的相对字符值,但在将字符串格式从 %d
更改为 %s
后,它打印出实际的 int 值。为什么?
scanf
与数据写入文件的方式无关。
fwrite
将数据写入文件,它写入的数据与计算机内存中存在的数据完全一样。
int
以数字的二进制表示形式存在,精确值(通常为 4 或 8 个字节长)。
如果让 fwrite
将这些字节存储在文件中,然后将它们视为文本,您会看到一些字符,但不是代表数字的十进制数字的字符。
这是因为你的文本编辑器无法知道这些字节属于C语言int
类型,需要重新解释才能让你查看。
如果您希望这些字节以人类可读的形式打印到文件中,请改用 fprintf
。
typedef struct info{ //main record
int *id;
unsigned char *name;
}student;
void create(){
student *s_ptr;
int num_of_student,i;
FILE *f_ptr;
f_ptr = fopen("studentdata.txt","w");
printf("**How many student to record**\n");
printf("Enter:");
scanf("%d",&num_of_student);
s_ptr = (student*)calloc(num_of_student,sizeof(student));
for(i=0;i<num_of_student;i++){
printf("Enter student id: ");
scanf("%d",&s_ptr[i]);//while string format is %d it prints char value to the file.
fflush(stdin);
printf("Enter student full name: ");
scanf("%[^\n]",&(s_ptr+i)->name);
fwrite(s_ptr+i,sizeof(struct info),1,f_ptr);
}
}
scanf("**%d**",&s_ptr[i])
打印其在文件中的相对字符值,但在将字符串格式从 %d
更改为 %s
后,它打印出实际的 int 值。为什么?
scanf
与数据写入文件的方式无关。
fwrite
将数据写入文件,它写入的数据与计算机内存中存在的数据完全一样。
int
以数字的二进制表示形式存在,精确值(通常为 4 或 8 个字节长)。
如果让 fwrite
将这些字节存储在文件中,然后将它们视为文本,您会看到一些字符,但不是代表数字的十进制数字的字符。
这是因为你的文本编辑器无法知道这些字节属于C语言int
类型,需要重新解释才能让你查看。
如果您希望这些字节以人类可读的形式打印到文件中,请改用 fprintf
。