文件操作之乱码

简介:CS在读小蒟蒻一枚,本文为自学笔记,如有佬指正,不胜感激!


目录

原代码(片段)

实际问题

来自chatGPT的建议

存档时写入文件的方式有问题

举例

解决方法

示例


原代码(片段)

string rolename;
bool _continue;
int gender;
int t;
int blood, boss1blood, boss2blood;
int Time;

//存档
FILE* pf = fopen(“fight_file.txt”, “w”);
fputc(gender + ‘0’, pf);
fputc(t + ‘0’, pf);
fputc(boss1blood + ‘0’, pf);
fputc(boss2blood + ‘0’, pf);
fputc(blood + ‘0’, pf);
fputs(rolename.c_str(), pf);
fflush(pf);
int ::fclose(FILE * stream);

//读档
FILE* pf = fopen(“fight_file.txt”, “r”);
gender = fgetc(pf);
if (gender != EOF) {
    IMAGE read;
    gender -= 48;
    int t = fgetc(pf) - 48;
    int HP1 = fgetc(pf) - 48;
    int HP2 = fgetc(pf) - 48;
    int blood = fgetc(pf) - 48;
    char name[20];
    fgets(name, 20, pf);
    int ::fclose(FILE * stream);
    cout << “name:” << name << endl;
    rolename = name;
}

 

实际问题

gender和rolename读档无误,但无论数据是什么,bossblood1、bossblood2、blood都是0、0、0

来自chatGPT的建议

存档时写入文件的方式有问题

举例

(以“blood”为例)

       在存档时,你将 blood 的值加上 ASCII 码值 '0' 后写入文件。这是一种很不直观的方式,因为它会将 blood 的值从整数转换为 ASCII 字符,并将这些字符写入文件中。在读档时,你从文件中读取这些字符,并将它们解析回整数。

解决方法

        将整数变量写入文件时,使用 fprintf 函数将其格式化为字符串,然后使用 fputs 函数将其写入文件中。

       在读档时,使用 fgets 函数读取整个字符串,并使用 sscanf 函数解析变量的值。

示例

// 存档
FILE* pf = fopen(“fight_file.txt”, “w”);
if (pf != nullptr) {
fprintf(pf, “%d,%d,%d,%d,%d,%s\n”, gender, t, boss1blood, boss2blood, blood, rolename.c_str());
fclose(pf);
}

// 读档
FILE* pf = fopen(“fight_file.txt”, “r”);
if (pf != nullptr) {
    char str[255];
    fgets(str, 255, pf);
    char* token = std::strtok(str, “,”);
    gender = std::atoi(token);
    token = std::strtok(nullptr, “,”);
    t = std::atoi(token);
    token = std::strtok(nullptr, “,”);
    boss1blood = std::atoi(token);
    token = std::strtok(nullptr, “,”);
    boss2blood = std::atoi(token);
    token = std::strtok(nullptr, “,”);
    blood = std::atoi(token);
    token = std::strtok(nullptr, “,”);
    rolename = token;
    fclose(pf);
}

不求甚解,先照猫画虎一会,如果后续学习深入,将更新~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值