使用C ++将不规则文件读入二维数组

时间:2011-09-24 23:07:24

标签: c++ file file-io io

我是C ++的新手。我相信stackoverflow中已有解决方案,但我找不到任何解决方案。

我需要将txt文件中的数据读入2维数组。文件就像

  

54 3 5 678

     

10 1 2 3 46 8 1 1 2 3 4

     

9 8 10

每行最多包含120个整数,且不超过60行。

您的回复非常感谢。谢谢!

更新:这不是功课。谢谢大家!

2 个答案:

答案 0 :(得分:4)

这里......

肯定是你需要的答案 1 ,尽管对C ++性质非常正确和真实。

而不是解析为锯齿状数组,而是读取vector vectorint#include <boost/spirit/include/qi.hpp> #include <boost/spirit/include/support_istream_iterator.hpp> #include <boost/spirit/include/karma.hpp> namespace spirit = boost::spirit; namespace qi = boost::spirit::qi; namespace karma = boost::spirit::karma; int main() { std::cin.unsetf(std::ios::skipws); spirit::istream_iterator b(std::cin), e; std::vector<std::vector<int> > vectors; if (qi::phrase_parse(b, e, +qi::int_ % qi::eol, qi::space - qi::eol, vectors)) std::cout << karma::format(karma::right_align(8)[karma::auto_] % ',' % '\n', vectors) << std::endl; return 0; }
(或者,一系列的集合,一堆deques,无论你喜欢什么痒)。

没有任何规格,我接受

  • 任意数量的行(直到第一个空行),
  • 任意行上的任意数字(&gt; 0)
  • 忽略任何地方的空白(除了行结束)
  • 任何整数(包括底片......)

干杯

  54,       3,       5,     678
  10,       1,       2,       3,      46,       8,       1,       1,       2,       3,       4
   9,       8,      10

对于显示的输入,它会打印:

<子>

#include <vector>
#include <iostream>
#include <sstream>
#include <algorithm>
#include <iterator>

static void display(const std::vector<int>& v)
{
    std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, ",\t"));
    std::cout << std::endl;
}

int main()
{
    std::vector<std::vector<int> > vectors;

    std::string s;
    while (std::getline(std::cin, s))
    {
        std::istringstream iss(s);
        vectors.push_back(std::vector<int>());
        std::copy(std::istream_iterator<int>(iss), std::istream_iterator<int>(), std::back_inserter(vectors.back()));
    }

    std::for_each(vectors.begin(), vectors.end(), display);
    return 0;
}

更新标准库版本

现场观看: http://ideone.com/HtAAg

为了好玩,这里是标准库的版本。只是为了表明,当你没有喷气推进库时,事情并不是那么糟糕:)

int[120][60]

1 我假设这是作业。我还假设你的老师要你分配一个int[60][120]或{{1}}(你怎么知道每行读取多少个数字? - 你需要额外的存储空间) < / p>

答案 1 :(得分:0)

我的解决方案,只需用你的文件流替换cin

#include <iostream>
#include <string>
#include <sstream>

using namespace std;

int main(int argc, char* argv[]) {
    string line;
    int ints[60][120] = {0}, i = 0;
    stringstream ss;

    while (getline(cin, line)) {
        ss.str(line);

        for(int j = 0; j < 120 && ss; j++) {
            ss >> ints[i][j];
        }

        ss.clear();
        i++;
    }

    cin.ignore();
    return 0;
}