【发布时间】:2017-07-09 09:00:24
【问题描述】:
我不知道为什么会这样。我有一个结构可以完美地打印到文件中,但是当我尝试读出该文件时,我得到的东西甚至与实际存在的内容都不接近。写/读部分:
int save_data(){
char enter = 0;
int response;
while(true){
printf("1. Add new player\n2. View player data\n3. Return to main");
printf("\nSelection: ");
scanf("%d", &response);
if (response == 1){
FILE* PlayerFile = fopen("players.txt","w");
int i = 0;
for (i = 0; i < 1; i++){
struct player_info aPlayer = create_player();
fprintf(PlayerFile, "Name: %s\nLevel: %d\nStrength Mod: %d\nDexterity Mod: %d\nConstitution Mod: %d\nIntelligence Mod: %d\nWisdom Mod: %d\nCharisma Mod: %d\n", aPlayer.name, aPlayer.Level, aPlayer.Str, aPlayer.Dex, aPlayer.Con, aPlayer.Int, aPlayer.Wis, aPlayer.Cha);
}
fclose(PlayerFile);
return 0;
}
else if (response == 2){
struct player_info aPlayer;{
char name[30];
int Level, Str, Dex, Con, Int, Wis, Cha;
};
FILE* PlayerFile = fopen("players.txt","r");
for (int i = 0; i < 1; i++){
struct player_info create_player;
fscanf(PlayerFile, "Name: %s\nLevel: %d\nStrength Mod: %d\nDexterity Mod: %d\nConstitution Mod: %d\nIntelligence Mod: %d\nWisdom Mod: %d\nCharisma Mod: %d\n", aPlayer.name, &aPlayer.Level, &aPlayer.Str, &aPlayer.Dex, &aPlayer.Con, &aPlayer.Int, &aPlayer.Wis, &aPlayer.Cha);
printf("\nName: %s\nLevel: %d\nStr mod: %d\nDex mod: %d\nCon mod: %d\nInt mod: %d\nWis mod: %d\nCha mod: %d\n\n", aPlayer.name, &aPlayer.Level, &aPlayer.Str, &aPlayer.Dex, &aPlayer.Con, &aPlayer.Int, &aPlayer.Wis, &aPlayer.Cha);
}
fclose(PlayerFile);
}
else if (response == 3){
false;
break;}
}
}
文件中实际存在的输入:
Name: Hamfast Drummond
Level: 9
Strength Mod: 8
Dexterity Mod: 7
Constitution Mod: 6
Intelligence Mod: 5
Wisdom Mod: 4
Charisma Mod: 3
打印上面的结果:
Name: Hamfast
Level: 6422172
Str mod: 6422176
Dex mod: 6422180
Con mod: 6422184
Int mod: 6422188
Wis mod: 6422192
Cha mod: 6422196
现在,我意识到这一行在所有变量之前都缺少&,但是当我添加它打印到文件中的内容是相同的错误数字并且在这种情况下读出是正确的,但它是没有将我放入的内容打印到文件中。
作为一个附带问题,如果允许我合二为一,我还希望它打印全名,而不仅仅是第一个,但我不知道该怎么做。
【问题讨论】:
-
当
response == 3你需要return false;,而不仅仅是false;。 -
这将消除事后休息的需要。我一直想知道为什么它没有休息就不能工作。感谢您清除它。
-
未使用的
struct player_info create_player;和{ char name[30]; int Level, Str, Dex, Con, Int, Wis, Cha; }; -
@bansi 那么那些不需要在那里吗?我将它们包括在内是因为我不确定它们是否有必要,只是为了安全。
-
仅供参考:或者您可以使用 fread 从文件中一次性读取整个结构。检查How to fread() structs?