【问题标题】:C ++ How to call ifstream with void?C ++如何用void调用ifstream?
【发布时间】:2019-11-29 23:12:16
【问题描述】:

总结:

1 - 带变量的结构

2——给变量赋值

3 - 文件中的无效保存变量

4 - 将值更改为变量

5 - void将值加载到变量中

6 - 我显示值

我的问题是:我正在创建一个系统,用于在 C++ 中使用代码块保存和加载“游戏”。一个简单的代码用于创建有问题的系统,但也用于在 .txt 或 .dat 的结构(几乎都是 int)中容纳的变量的值。

#include<iostream>
#include<fstream>

using namespace std;

///GAME VAR
struct NewGame{
float tipo;
float health;
};

///SAVE_LOAD
void saveGame( NewGame G );
void loadGame( NewGame ( & G ) );

int main(){

///STRUCT
NewGame G;

///VALUE ASIGN (TEST)
cout << "Ingrese tipo [1] [2] [3]" << endl;
cin >> G.tipo;
cout << "Ingrese vida"<<endl;
cin >> G.health;

///SAVE STRUCT
    saveGame( G );

///CHANGE VALUES
G.health = 0;
G.tipo = 0;

///LOAD STRUCT <-----HERE'S THE PROBLEM
    loadGame( G );

///TEST VALUES
cout << "HEALTH: " << G.health << endl;
cout << "TYPE: " << G.tipo << endl;


return 0;
}

///SAVE
void saveGame( NewGame G){

ofstream s;
    s.open("save.txt");
    s << G.health << endl;
    s << G.tipo << endl;
    s.close();

};

///LOAD
void loadGame( NewGame ( & G ) ){

ifstream l;
    l.open("save.txt");
    l >> G.health;
    l >> G.tipo;
    l.close();

};

我已经尝试了几种方法,在binary和txt中问题总是一样的,数据保存了,加载新游戏后测试了值,变量的值没有恢复。

【问题讨论】:

  • 你对函数的使用,虽然在技术上是有效的,但是很不正常。任何好的介绍性材料都会使用void saveGame(NewGame G); 之类的语法来声明它,并使用saveGame(G); 来调用它。
  • 谢谢,我已经更正了,它看起来更好了,但问题仍然存在。错误一定是在使用 ifstream 中,或者在值的分配中,我想...
  • 尝试以附加模式打开输出文件(即s.open("save.txt", ios_base::app)
  • 加载时传递G作为参考
  • 非常感谢@Arne。这就是我需要的解决方案

标签: c++ struct void


【解决方案1】:

所以,我打算继续回答自己,只是对当前答案进行投票,但我认为我需要解决当前答案没有解决的问题。

问题根本不在于ifstream。看看loadGame()里面G的值,应该没问题:

///LOAD
void loadGame( NewGame G ){

    ifstream l;
    l.open("save.txt");
    l >> G.health;
    l >> G.tipo;
    l.close();

    // My additions: print the value of the variables stored in G
    std::cout << "Health: " << G.health << "\n";
    std::cout << "Tipo: " << G.tipo << "\n";

}

这应该具有正确的值。如果是这样,那么您可以确定ifstream 工作正常。那不是你的问题。

你的问题是你的参数是passed by value。这意味着loadGame() 仅使用传递给它的数据的副本,不是原始数据。这实际上意味着main() 无法访问loadGame() 中的数据。

您有两个选择:一个是更改您的函数以返回 NewGame(我将从您的问题中假设这不是一个选项,并且出于某种原因必须返回 void)或者,二、pass by reference

///LOAD
void loadGame( NewGame& G ){ // a single & makes all the difference here

    ifstream l;
    l.open("save.txt");
    l >> G.health;
    l >> G.tipo;
    l.close();
}

这将允许您从main() 访问放在G 中的值。

【讨论】:

    【解决方案2】:

    因为您将G 的副本传递给loadgame() 函数。尝试 void loadGame( NewGame&amp; G ) 代替。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多