【问题标题】:read irregular file into a 2-dimension array using C++使用 C++ 将不规则文件读入二维数组
【发布时间】:2011-11-24 10:41:10
【问题描述】:

我对 C++ 很陌生。我相信 stackoverflow 中已经有解决方案,但我找不到任何解决方案。

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

54 3 5 678

10 1 2 3 46 8 1 1 2 3 4

9 8 10

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

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

更新:这不是家庭作业。谢谢大家!

【问题讨论】:

  • 如果是作业,则应添加“作业”标签,并简要说明作业要求。

标签: c++ file file-io io


【解决方案1】:

来了……

绝对是您需要的答案1,虽然非常正确且符合 C++ 特性。

它不是解析成锯齿状数组,而是读入vectorvectors 或ints。
(或者,一个集合列表,一堆双端队列,任何你喜欢的东西)。

在没有任何规格的情况下,我接受

  • 任意数量的行(直到第一个空行),
  • 任意行上的任意数量 (>0) 个数字
  • 忽略任何地方的空格(除了行尾)
  • 任何整数(包括负数...)

干杯

#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;
}

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

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

更新标准库版本

在这里现场观看:http://ideone.com/HtAAg

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

#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;
}

1我假设这是家庭作业。我还假设您的老师希望您分配 int[120][60]int[60][120](您怎么知道每行读取了多少个数字?-您需要额外的存储空间)

【讨论】:

【解决方案2】:

我的解决方案,只需将 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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-16
    • 1970-01-01
    • 1970-01-01
    • 2015-05-16
    • 2020-07-08
    • 2019-03-24
    • 1970-01-01
    相关资源
    最近更新 更多