有人可以帮我纠正以下代码吗?
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”文件中得到了预期的输出,如下图所示:
我认为问题在于“fwrite”,但我无法找出问题。
答案 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.name
和e.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)
。