如何只读取文件.txt中的数字?

时间:2016-07-31 11:52:18

标签: c++ file ifstream

我只需要读取文件中的数字。该文件包含:

0
#####################
#    |    |    |    #
#    |    |    |   2#
#    |    |   2|    #
#    |    |    |    #
#####################

我只想读第一个0分,分数和其他两个数字。空格我想将它们保存为0.我想将分数保存为int,其余的保存为向量。

因此载体应包含:

score = 0
0000000200200000

我的代码是下一个,但它不起作用:

string line;
vector<int> v;
int sscore = 0, count = 0;
ifstream in ("save_game.txt");
vector<vector<Tile> > vt;

if (in.is_open()) {

    while (getline (in, line)) {
        if (line.size() == 1)
            sscore = str2int(line);
        else {
            for (int i = 0; i < (int) line.size(); i++) {
                string l = line.substr(i, 1);
                char c = l[0];
                if (l[0] == '#' || l[0] == '|') {count = 0;}
                else {
                    if (c != ' ') {
                        count = 0;
                        int ss = str2int(l);
                        v.push_back(ss);
                    }
                    else {
                        count++;
                        if (count == 3)
                            v.push_back(0); 
                    }
                }
            }
        }
    }

    in.close();
}

这是str2int函数

int str2int(string s){
    istringstream reader(s);
    unsigned int val = 0;
    reader >> val;
    return val;
}

非常感谢。

2 个答案:

答案 0 :(得分:1)

我在这里只使用简单的流提取操作(实际上,可能是boost::regex_split),没有std::string解析。

  • 使用0阅读第一个operator>>,然后使用std::ignore删除尾随的换行符,或std::getline并检查是否没有额外的(非空白)字符存在

  • std::ignorestd::getline并验证####行。

  • operator>>char一起使用并验证其为#

  • 在循环中,尝试operator>> int默认为0,如果失败,in.clear()并使用operator>> char 1}}要阅读的内容似乎不是数字,而是|#。根据那个继续循环。

  • 与第一个项目符号点类似,在第二个#之后处理剩下的行

始终检查每个提取操作是否成功。

答案 1 :(得分:0)

只需忽略其他输入并保存数字,检查我为你发布的同一文本文件所做的工作,最后矢量必须有0 2 2作为值。 screenshot

我忘了把所有其他角色都弄0,但这不是一个问题,现在只需替换​​继续;屏幕截图中的语句使用nums.push_back(0);