我在将结构附加到文件时遇到了一些麻烦: 操作系统:Ubuntu 14.04
STRUCT:
struct baris
{
char name[30];
char trusted[1];
int phone;
int id;
};
FUNC:
addNewBariga()
{
char answer[30];
struct baris new;
while(1){
printf("Enter new Barigas' ID please.");
scanf("%d",&new.id);
printf("Enter new Barigas' name please.\n");
scanf("%s",new.name);
printf("Enter new Barigas phone please. \n");
scanf("%d", &new.phone);
printf("Is Bariga trusted?\n\t[Y/N]:");
scanf("%s",new.trusted);
while(1)
{
if(strcmp(new.trusted,"Y") != 0 && strcmp(new.trusted,"y") != 0)
{
printf("%s",new.trusted);
printf("\nWrong command givven.\t\n[Y/N]:");
scanf("%s",&new.trusted);
}
else
break;
}
printf("Values you've entered:\n\tID:%d\n\tName: %s\n\tPhone: %d\n\tTrustworth:%s\nWould you like to proceed to saving?\n[Y/N]:\n",new.id,new.name,new.phone,new.trusted);
scanf("%s",&answer);
if(strcmp(answer,"Y") ==0 || strcmp(answer,"y")==0) //Process to saving
{
printf("saving...");
confPtr = fopen(filePath , "ab");
//fwrite(new.id, sizeof(new.id), 1, confPtr);
fwrite(&new, sizeof(struct baris), 1, confPtr);
fclose(confPtr);
break;
}
}
我得到了什么:
fabio\00\00\00\00\00\00\00\00\00fab\00\00\00\00\00\00\00\00\00fab\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00 <1\B5y\00\00\00\00\00\00\00fab\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00 \C5f\DAy\00\00\00\00\00\00\00
答案 0 :(得分:1)
那个输出看起来基本正确,你期待什么?
您正在将二进制数据写入二进制文件。二进制文件不容易手动检查。
结构的第一个成员name
在输出中总是长30个字节。例如。
注意@BLUEPIXY在评论中指出:
scanf("%s",new.trusted);
如果输入非零长度,则触发未定义的行为,因为trusted
只有1个字符长,由字符串终止符占用。你应该增加它的长度,或者(更好!)停止使用这样的直接scanf()
,而是用fgets()
读取整行输入并使用sscanf()
解析它。
此外,当使用可能失败的功能(例如scanf()
,sscanf()
或fgets()
)时,必须检查返回值,然后再依赖它们成功了。