如何组织多维数组中的文本文件中的数据并从中添加列?

问题描述 投票:1回答:2

对不起,我对c ++有点新意,但是我需要将数据从txt文件组织成一个数组(或者如果更容易的话,那就是向量),它需要有12列和10000行。我需要能够将这些列相乘,但我无法将数据放入行中。数据由选项卡解析,并且已经是12x10000格式。我怎么能只使用c ++这样做?

我已经尝试过在网上寻找,除了阅读文本之外别无他法。我还有225行代码,这些代码都是我尝试这样做的所有尝试。它基本上归结为这些线。我有一个解析器,但它没有做任何事情,只是按标签划分数据,而不是识别它。

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main ()
{
    float array[12][10000]; // creates array to hold names
    long loop=0; //short for loop for input
    float line; //this will contain the data read from the file
    ifstream myfile ("data.txt"); //opening the file.
    if (myfile.is_open()) //if the file is open
    {
        while (! myfile.eof() ) //while the end of file is NOT reached
        {
            getline (myfile,line); //get one line from the file
            array[loop] = line;
            cout << array[loop] << endl; //and output it
            loop++;
        }
        myfile.close(); //closing the file
    }
    else cout << "Unable to open file"; //if the file is not open output
    system("PAUSE");
    return 0;
}

我期望结果是组织成数组或向量的数据(我不知道如何使用向量),我可以将列乘以,但它只是因为我无法正确地将代码放入列中而出现错误。

c++ arrays vector notepad
2个回答
1
投票

这是一个简单的解决方案,适用于制表符或空格的分隔符。

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

constexpr size_t rows_len = 10000;
constexpr size_t cols_len = 12;

int main ()
{
    float array[rows_len][cols_len]{}; // value initialization to ensure unfilled cells at 0
    ifstream myfile("data.txt");
    if (!myfile.is_open()) {
        cout << "Unable to open file" << endl;
        return 1;
    }
    string line;
    for (size_t row = 0; row < rows_len && myfile; row++) {
        getline(myfile, line);
        const char* s = line.c_str();
        for (size_t col = 0; col < cols_len; col++) {
            char* p = nullptr;
            array[row][col] = strtof(s, &p);
            s = p;
        }
    }

    // use array ...

    return 0;
}

strtof()的第二个参数允许知道下一个单元格的开头在哪里。如果单元格不是数字,则array的所有剩余行都将设置为0。


0
投票

如果您确定将遵循输入格式,则可以简单地让iostream模块解码浮点值:

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main ()
{
    float array[12][10000]; // creates array to hold names
    long loop=0; //short for loop for input
    float line; //this will contain the data read from the file
    ifstream myfile ("data.txt"); //opening the file.
    if (myfile.is_open()) //if the file is open
    {
        for(int line=0; line <1000; line++) //read 1000 lines
        {
            for (int col=0; col<12; col++)  // 12 values per line
            {
                myfile >> arr[col][line];
                if (!myfile)
                {
                    cout << "Read error line " << line << " col " << col << "\n";
                    myfile.close();
                    return 1;
                }
            }
        }
        myfile.close(); //closing the file
    }
    else cout << "Unable to open file"; //if the file is not open output
    system("PAUSE");
    return 0;
}

请注意,此代码不使用while (! myfile.eof() )上的皱眉,但在阅读后立即进行测试

© www.soinside.com 2019 - 2024. All rights reserved.