麻烦将结构附加到C中的文件

时间:2014-10-22 13:39:07

标签: c file io structure fwrite

我在将结构附加到文件时遇到了一些麻烦: 操作系统: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

1 个答案:

答案 0 :(得分:1)

那个输出看起来基本正确,你期待什么?

您正在将二进制数据写入二进制文件。二进制文件不容易手动检查。

结构的第一个成员name在输出中总是长30个字节。例如。

注意@BLUEPIXY在评论中指出:

scanf("%s",new.trusted);
如果输入非零长度,则

触发未定义的行为,因为trusted只有1个字符长,由字符串终止符占用。你应该增加它的长度,或者(更好!)停止使用这样的直接scanf(),而是用fgets()读取整行输入并使用sscanf()解析它。

此外,当使用可能失败的功能(例如scanf()sscanf()fgets())时,必须检查返回值,然后再依赖它们成功了。