C++读取包含多种变量的txt文件
Posted
技术标签:
【中文标题】C++读取包含多种变量的txt文件【英文标题】:C++ Reading a txt file containing multiple kinds of variables 【发布时间】:2017-03-22 18:55:07 【问题描述】:我的技能非常基础。我正在尝试为文本游戏制作保存和加载功能。这是我的代码:
#include <fstream>
#include <iostream>
#include <cstdlib>
#include <string>
#include <sstream>
#include "variables.h"
// CORE FUNCTIONS
void save_game()
std::ofstream file((savefile_path + "/" + player_name + ".txt").c_str());
if (file.is_open())
file << engine_switch << std::endl; //int
file << map_switch << std::endl; // int
file << sub_map_switch << std::endl; // int
file << player_name << std::endl; //string
file << player_class << std::endl; // string
//file << << endl;
file.close();
else
std::cout << "A PROBLEM OCCURED";
system("pause");
return;
void load_game()
system("cls");
std::cout << "ENTER THE SAVE FILE NAME (SAME AS YOUR CHARACTER NAME)\nOR PRESS ENTER TO GO BACK TO MAIN MENU: ";
fflush(stdin);
getline(std::cin, player_name);
std::string name=player_name;
std::ifstream file((savefile_path + "/" + player_name + ".txt").c_str());
if(file)
file >> engine_switch; // this is int
file >> map_switch; // this is int
file >> sub_map_switch; /this is int
file >> player_name; //string
file >> player_class; //string
//file >> ;
return;
else
if(player_name=="\0")
engine_switch=1;
return;
else
system("cls");
std::cout << "COULDN'T OPEN THE SAVE FILE" << std::endl;
system("pause");
load_game();
engine_switch=1;
return;
当我输入由空格分隔的多个单词的 player_name 复合词时,就会出现问题。例如,当我输入“名称名称”时,player_name
变成名称,player_class
变成名称,实际的 player_class
没有放入任何变量中。
我尝试了rdbuf()
功能,但是没有用,我什至还不明白。我用stream
、string
、c.str()
试过了,我在网上找到的所有东西都能理解,但总是出错。
【问题讨论】:
【参考方案1】:当您从流中提取字符串时,空格被视为分隔符。
更糟糕的是:在您的代码中,player_name
后跟 player_class
,这也是一个字符串。你的程序应该如何解释这个:
10 15 20 John William Doe hero B
您的程序如何猜测John William Doe
是组合名称而hero B
是类别?
最简单的解决方案是将所有字符串写入文件中的单独行。当您加载它时,您可以使用getline()
阅读它:
file >> engine_switch; // this is int
file >> map_switch; // this is int
file >> sub_map_switch; /this is int
getline (file, player_name); //string
getline (file, player_class; //string
【讨论】:
没错。但是,如果您在每个字符串后写一个新行,输入将显示“Jowhn WIlliam Doe”跳过新行,然后在第二个字符串中读取“hero B”。 是的,很抱歉。误读了你的观点。但是在重新读取时,代码会暴露在file >> sub_map_switch;
之后留在流中的行尾
肯定还是有问题,因为现在我的程序将 player_name 读取为 player_class 而 player_name 为空。顺便说一句,它现在把每一个字都写了,所以很好,但仍然不是。
嗯,看到了。 @Sumerechny 在file >> sub_map_switch;
之后添加file.ignore()
(或file.ignore(numeric_limits<streamsize>::max(), '\n');
,如果你真的想确定,但记得#include <limits>
得到max
)以吃掉行尾。否则getline
找到行尾并立即返回。
是的,很抱歉,我没有看到您已经在每个字段之后设置了新的留置权。那么会发生什么,file>>sub_map_switch
提取整数。下一个要读取的字符是尾随换行符。因此,在您的情况下,您首先需要ignore()
尾随换行符,然后再执行getline()
。请注意,仅当您在 getline()
之后执行 >>
时才需要忽略;不在两个 getline()
之间【参考方案2】:
您需要在load-game
函数中使用getline
而不是>>
运算符。
不要做file >> player_name
做getline(file, player_name)
这应该用于替换每次出现的file >> someVar
编辑:我没有意识到其他都是整数值。对于那些您仍应使用>>
运算符的人。
【讨论】:
如果所有这些信息(engine_switch
、map_switch
、...)都放在一行中怎么办?
我写了这样的东西:std::getline(file, engine_switch);标准::getline(文件,map_switch); std::getline(file, sub_map_switch); std::getline(file, player_name); std::getline(file, player_class);我得到一个错误“没有匹配函数调用'getline(std::ifstream&, int&'
值得编辑添加注释,说明混合std::getline
和operator>>
可能产生的困难,特别是>>
在缓冲区中留下一个换行符,以便getline
绊倒。跨度>
@Sumerechny 抱歉,这是我的错误。请注意错误消息告诉您出了什么问题,getline 不接受整数值。我在您的代码中错过了这一点。所以对于那些你仍然需要使用>>
操作符的人。
@ErvinSzilagyi 那么这是一个糟糕的设计决策,需要用其他字符分隔,在这种情况下,您可以将第三个参数添加到 getline
以仅到达指定的字符。 以上是关于C++读取包含多种变量的txt文件的主要内容,如果未能解决你的问题,请参考以下文章