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() 功能,但是没有用,我什至还不明白。我用streamstringc.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 &gt;&gt; sub_map_switch; 之后留在流中的行尾 肯定还是有问题,因为现在我的程序将 player_name 读取为 player_class 而 player_name 为空。顺便说一句,它现在把每一个字都写了,所以很好,但仍然不是。 嗯,看到了。 @Sumerechny 在file &gt;&gt; sub_map_switch; 之后添加file.ignore()(或file.ignore(numeric_limits&lt;streamsize&gt;::max(), '\n');,如果你真的想确定,但记得#include &lt;limits&gt; 得到max)以吃掉行尾。否则getline 找到行尾并立即返回。 是的,很抱歉,我没有看到您已经在每个字段之后设置了新的留置权。那么会发生什么,file&gt;&gt;sub_map_switch 提取整数。下一个要读取的字符是尾随换行符。因此,在您的情况下,您首先需要ignore() 尾随换行符,然后再执行getline()。请注意,仅当您在 getline() 之后执行 &gt;&gt; 时才需要忽略;不在两个 getline() 之间【参考方案2】:

您需要在load-game 函数中使用getline 而不是&gt;&gt; 运算符。

不要做file &gt;&gt; player_namegetline(file, player_name) 这应该用于替换每次出现的file &gt;&gt; someVar

编辑:我没有意识到其他都是整数值。对于那些您仍应使用&gt;&gt; 运算符的人。

【讨论】:

如果所有这些信息(engine_switchmap_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::getlineoperator&gt;&gt; 可能产生的困难,特别是&gt;&gt; 在缓冲区中留下一个换行符,以便getline 绊倒。跨度> @Sumerechny 抱歉,这是我的错误。请注意错误消息告诉您出了什么问题,getline 不接受整数值。我在您的代码中错过了这一点。所以对于那些你仍然需要使用&gt;&gt; 操作符的人。 @ErvinSzilagyi 那么这是一个糟糕的设计决策,需要用其他字符分隔,在这种情况下,您可以将第三个参数添加到 getline 以仅到达指定的字符。

以上是关于C++读取包含多种变量的txt文件的主要内容,如果未能解决你的问题,请参考以下文章

C++:从 txt 文件读取和写入的成员函数

如何使用 C++ 在 .txt 文件中写入、读取和重写

c++ 读取输出txt文件

C++如何逐行读取txt文件,并将读取出来的数据进行运算导入到另一个文件中。

从 .txt 文件读取并输入到 parrel 数组 C++

在c++中怎么实现TXT文件查找和读取