函数“fwrite”写入意外记录

时间:2015-07-10 07:51:38

标签: c file-io struct

有人可以帮我纠正以下代码吗?

int main()
{
    FILE *fp;
    char another='Y';
    struct emp
    {
        char name[40];
        int age;
        float bs; //basic salary
    }e;
    fp=fopen("Employee.DAT","wb");
    if(fp==NULL)
    {
        printf("Cannot open file");
        exit(1);
    }
    while(another=='Y')
    {
        printf("\nEnter name, age and basic salary:");
        scanf("%s %d %f",e.name,&e.age,&e.bs);
        fwrite(&e,sizeof(e),1,fp);

        printf("Add another record?(Y/N)");
        fflush(stdin);
        another=getche();
    }
    fclose(fp);
    return 0;
}

我正在尝试将以下记录输入文件“Employee.DAT”:
Abc 19 12345 Def 20 12345
但是我在“Employee.DAT”文件中得到了预期的输出,如下图所示:enter image description here
我认为问题在于“fwrite”,但我无法找出问题。

4 个答案:

答案 0 :(得分:1)

fwrite不是在这里使用的正确函数。它没有关心格式,struct padding(e可能有填充)等等。它只会尝试写下你要写的块数。

如果您想要格式化文件IO(根据您的预期输出需要),请使用fprintf()

答案 1 :(得分:1)

您是否在fwrite之前打印final int maxResult =5; String addressList[] = new String[maxResult]; try { List<Address> addresses = geocoder.getFromLocation(LATITUDE, LONGITUDE, maxResult); if(addresses != null) { for (int j=0; j<maxResult; j++){ Address returnedAddress = addresses.get(j); StringBuilder strReturnedAddress = new StringBuilder(); for(int i=0; i<returnedAddress.getMaxAddressLineIndex(); i++) { strReturnedAddress.append(returnedAddress.getAddressLine(i)).append("\n"); } addressList[j] = strReturnedAddress.toString(); } adapter = new ArrayAdapter<>(getApplicationContext(), android.R.layout.simple_spinner_item, addressList); adapter.setDropDownViewResource(android.R.layout. simple_spinner_dropdown_item); myAddressList.setAdapter(adapter); myAddressList.setOnItemSelectedListener(myAddressListOnItemSelectedListener); }e.namee.age?它包含了良好的价值吗?如果是这样,我建议你创建一个输出字符串,首先以你想要的格式存储变量:

e.bs

Joachim注意到的另一件事:你可能想要打开你的文件:

char output[MAX_OUTPUT_LENGTH];
...code...
scanf("%s %d %f",e.name,&e.age,&e.bs);
sprintf(output, "%s %d %f", e.name,e.age,e.bs);
fwrite(output,1,sizeof(output),fp);

答案 2 :(得分:0)

fwrite(&e,sizeof(e),1,fp);

你给错误的顺序给出了参数。

fwrite(&e,1,sizeof(e),fp);

这是正确的顺序。

定义就是这个 -

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)

答案 3 :(得分:0)

如果您想要格式化输出,可以使用fprintf()打印单个元素。有关详细信息,请参阅man page

另外,不要fflush(stdin)。这是undefined behaviour

尽管如此,main()的推荐签名是int main(void)