C ++读入像网格

时间:2017-03-12 23:57:05

标签: c++

我在C ++中进行编码,我试图在一个文件中读取我以后想访问某些字符的文件。就像在文件中的任何给定点一样,(x行,char y)的char是什么。

我现在唯一的想法就是寻找一个换行符,并以某种方式对它们进行索引,以便我可以返回到换行符x,检查一行的长度,并在给定行长度的任何位置拉一个char。 / p>

我不确定这是否是一种好方法。

3 个答案:

答案 0 :(得分:-1)

试试这个(对于行中的字符" lineNum"以及列" columnNum"):

ifstream inf;
inf.open(filename); //filename being c-string

string str;
for (int i = 0; i < lineNum; i++)
{
     std::getline(inf, str); 
}

这种方式&#34; str&#34;存储您感兴趣的行(自动检查换行符并停止)。 然后你可以使用:

char chr = str[columnNum];

将你想要的角色存储在&#34; chr&#34;变量。别忘了:

inf.close();

不幸的是,据我所知,每次想要访问角色时都需要重复此过程。

答案 1 :(得分:-1)

#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <sstream>

#define FILENAME "File.txt"

class FileGrid {
public:
    typedef std::vector<std::string> Line;
    typedef std::vector<std::string>::const_iterator LineIter;

    typedef std::vector<std::vector<std::string>> StringMap;
    typedef std::vector<std::vector<std::string>>::const_iterator StringMapIter;


    void FillGrid(char* fileName) {
        grid.clear();
        std::ifstream in(FILENAME, std::ifstream::in);
        if (!in.is_open()) {
            std::cout << "problem reading " << FILENAME << std::endl;
            return;
        }

        std::string words;
        std::string word;
        std::stringbuf buffer;

        while (in.is_open() && std::getline(in, words)) {
            std::stringstream ss(words);
            Line line;
            while (ss >> word) {
                line.push_back(word);
            }

            grid.push_back(line);
        }
    }
    void PrintGrid() {
        StringMapIter b = grid.begin();
        StringMapIter e = grid.end();

        std::cout << "\t\tFile Content:" << std::endl;
        while(b != e) {
            for (unsigned int i = 0; i < b->size(); ++i) {
                std::cout << b->operator[](i) << " ";
            }
            std::cout << std::endl;
            ++b;
        }
    }

    char const & GetChar(int lineNo, int charNo) {
        // LineNo checks etc
        Line const & line = grid[lineNo];
        for(std::string const & word : line ) {
            if(charNo > word.size() + 1) {
                charNo -= word.size() + 1;
            }
            else {
                return word[charNo];
            }
        }

        throw std::exception("charNo higher");
    }

private:
    StringMap grid;


};

void main() {

    FileGrid grid;
    grid.FillGrid(FILENAME);
    grid.PrintGrid();

    std::cout << grid.GetChar(0, 3); // should return first line, 4th character
}

不是我写过的最好的代码,而是我在短时间内可以做的事情。

FileGrid处理读取和访问数据。它逐行读取文件并将其存储在std::vector中。当它完成读取一行时,它会将其推送到另一行std::vector。最后,我们有一个(某种)2D字符串数组。

同样,不是最好的代码,绝对不是最优化的代码,但想法仍然是相同的:逐行读取文件,分隔每个单词并将它们放入字符串数组中。如果你不能使用STL,你可以动态地为每一行创建一个2D数组,但由于我不知道你问题的具体要求,我只是写了一些简单而强大的东西来向你展示存储字符串网格的主要方式进入记忆。

答案 2 :(得分:-2)

只要它有效。但是将整个文件读入内存,如果这是一个选项,会更简单。