【问题标题】:Pick elements of an array from text file从文本文件中选择数组的元素
【发布时间】:2015-12-27 11:43:35
【问题描述】:

我有一个包含 1000 行的文本文件,每行有 130 个数字。 我想将数字导入数组然后使用它们。 我想打印出每行的前两个数字,我使用了一个循环,它不能按预期工作。 输出应该类似于

1126

2124

3 128

4 123

// 等等...

代码是:

#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include<cstdlib>
#include <array>

int main()
{
    int l=0, r=0;
    int line[1000][1000];
    std::ifstream in("bragg_events.txt");

    if (!in) {
        std::cout << "Cannot open file.\n";
        return;
    }

    for (l = 0; l < 1000; l++)
    {
         for (r = 0; r < 130; r++)
    {
        in >> line[r][l];
      
      }
     std::cout << line[0][l] << " " << line[1][l] << "\n";
    }

    in.close();

    return 0;
}

它实际上打印:

1126(正常)

20 34(不好)

64 61

38 54

113 130

152164

你猜到哪里不对了吗?

【问题讨论】:

  • 我猜你应该在你的数组中交换你的 l 和 r 变量......并且你在循环的每个周期都打印前两个元素,所以在第一个元素上你打印第一个元素(已设置)和第二个(尚未设置)。

标签: c++ arrays for-loop text


【解决方案1】:

您的std::cout 语句必须在for 循环之外。 Line[1][l] 未在 r 的第一个循环中初始化。对?

【讨论】:

  • 确切地说是在内层for循环之后。
  • 但是不应该在循环继续时覆盖 line[1][l] 的值吗?
  • @OlzhasZhumabek 不,不会。就我个人而言,我会交换 array[line][row] 之类的变量,OP 目前正在使用 array[row][line],这对我来说似乎很奇怪,但仍然有效......
  • 是的,在内循环之外工作,现在每行只有一个值,但发生了一些奇怪的事情。第一行没问题,第二行打印出第二行的第 3 个和第 4 个元素,第三个打印出第三行的第 7 个和第 8 个元素,第 4 个打印出第 7 个和第 8 个元素,第 5 个打印出第 12 个和第 13 个元素和依此类推..我仍在使用 std::cout
  • 请使用新代码更新您的问题。也许你切换了一些变量......
【解决方案2】:

您可以使用两个int 数据成员定义一个对象,并使用新定义的对象的std::vector 来存储文件中的值,而不是使用数组。比如:

class Object_name {
public:    
    Object_name (int ll, int rr) : l(ll), r(rr) {}

    // data members
    int l;
    int r;
}; 

std::vector<Object_name> file_content;

然后像这样读取文件:

std::ifstream in("bragg_events.txt");
if(!in) std::cerr << "Can't open input file!\n";

// read file line by line
std::string line;
while (std::getline(in, line)) {

    // extract all numbers by pairs from a single line
    std::stringstream ss(line);

    int l = 0, r = 0;
    while (ss >> l >> r) {

        // use a pair of numbers to create an object and store in the vector
        file_content.push_back(Object_name(l, r)); 
    }

}

// print pair of numbers
for (auto i = 0; i < file_content.size(); ++i) {
    std::cout << file_content[i].l <<" "<< file_content[i].r <<'\n';
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-08
    • 1970-01-01
    • 2013-12-04
    • 2022-07-11
    • 1970-01-01
    • 2011-03-11
    相关资源
    最近更新 更多