2015-07-10 38 views
1

任何人都可以请帮我纠正下面的代码吗?函数“fwrite”写入意外的记录

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”,但我无法找出问题。

+0

*您如何*尝试查看文件?你知道它是*二进制*,通常不可读为文本文件?它是二进制的,意味着你写的数据是用计算机使用的内部二进制格式写的,你不能简单地在文本文件中打开文件,并希望看到你编写的文本为文本。 –

+1

顺便说一句,不要做'fflush(stdin)',它不被C标准支持。 –

+0

@JoachimPileborg文件在我保存程序的文件夹中创建。 –

回答

1

在fwrite之前打印e.name,e.agee.bs吗?它是否包含好的价值?如果没有,我建议你做一个输出字符串变量首先存储格式,你想:

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); 

另一件事由约阿希姆注意到:你可能想打开你的文件,像这样:

fp = fopen("Employee.DAT", "w"); 
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) 
+0

由于他只写一条记录,它仍然会写入记录。 –

+0

但尝试写入多条记录时出现错误。 – ameyCU

+0

你确定吗?我希望它“只”会让程序员感到困惑,除非触发某些特殊情况。 –

1

fwrite是不是在这里使用正确的函数。它不关心格式,结构填充(e可能有填充)等等。它只会尝试写入您要求写入的块数。

使用fprintf()而不是如果你想格式化文件IO(这是你需要基于你的预期输出)。

0

如果您想要一个格式的输出,您可以使用fprintf()来打印各个元素。有关更多信息,请参阅man page。另外,不要做fflush(stdin)。它是undefined behaviour

也就是说,推荐的签名main()int main(void)