簡體   English   中英

從文件讀取數據到結構數組

[英]Reading data into a struct array from a file

我有一個看起來像這樣的輸入文件

 1 0 3
 2 11 5
 3 15 1
 4 16 11

和看起來像這樣的結構

struct numb {
int numb1;
int numb2;
int numb3;
}

並且我需要創建一個結構數組,以便該數組的每個元素都包含所有三個數字。 所以

numbArray[0].numb1 == 1
numbArray[0].numb2 == 0
numbArray[0].numb3 == 3
numbArray[1].numb1 == 2
numbArray[1].numb2 == 11

等等。 我已經費勁地打開和關閉文件,查找文件中有多少行,並從文件中讀取一行,但是我不知道如何存儲一行中的單個元素。

到目前為止,我的程序如下所示:

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

int main(int argc, char* argv[])
{
    ifstream inFile(argv[1]);
    int fileLength = 0;
    std::string line;
    while(std::getline(inFile, line))
    {
        ++fileLength;
    }
    struct numb {
    int numb1;
    int numb2;
    int numb3;
    }
    if(inFile.is_open())
    {
        for(unsigned i = 0; i <= fileLength; i++)
        {
            //What to do here?
        }
    }
}

當您的輸入沒有規則的結構並且需要處理行之間的變化時,請使用getline 當您的輸入文件具有規則結構(在這種情況下,每行始終有三個值)時,只需直接使用流提取運算符:

#include <iostream>
#include <vector>

struct group
{
    int n1;
    int n2;
    int n3;
};

int main()
{
    std::vector<group> groups;
    while (std::cin)
    {
        group line;
        line.n1 << std::cin;
        line.n2 << std::cin;
        line.n3 << std::cin;
        groups.push_back(group);
    }
}

盡可能直接在代碼中表達您的想法

請注意,我已編寫代碼,假定文件格式正確。 如果每行中的值太多或太少,那么上面的代碼將被混淆。 但是,最好編寫可能會起作用最簡單的代碼,並在需要時擔心復雜性。 在您的示例中,您指出輸入文件的格式正確,因此不需要使事情復雜化。

我建議為此使用std::stringstream

#include <iostream>
#include <sstream>
#include <string>
#include <stdio.h>
#include <vector>

struct numb {
  int numb1;
  int numb2;
  int numb3;
};

void populate(std::vector<numb>& my_numbs, std::string line) {
   std::stringstream ss(line);
   numb my_numb;
   ss >> my_numb.numb1 >> my_numb.numb2 >> my_numb.numb3;
   my_numbs.push_back(my_numb);
}

void output(const numb my_numbs) {
    printf("%d %d %d\n", my_numbs.numb1, my_numbs.numb2, my_numbs.numb3);
}

int main(int argc, char* argv[]) {
  ifstream inFile(argv[1]);
  std::string line;
  std::vector<numb> my_vect;
  while(std::getline(inFile, line)) {
    populate(my_vect, line);
  }

  for(size_t i = 0; i < my_vect.size(); ++i) {
    std::cout << "my_vect[" << i << "]:";
    output(my_vect[i]);
  }

  return 0;
}

std::stringstream允許您從std::string解析出數據類型,您只需要解析3個int即可與您的結構一起使用。 然后,將結構推入向量。

這是正在工作的ideone接受stdin的輸入。

您應該應該可以執行以下操作:

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;
int main(int argc, char* argv[])
{
    ifstream inFile(argv[1]);
    int fileLength = 0;
    std::string line;
    struct numb {
        int numb1;
        int numb2;
        int numb3;
    };
    vector<vector<int>> sets;
    int n1, n2, n3;
    while (std::cin >> n1)
    {
        cin >> n2;
        cin >> n3;
        vector<int> vec;
        vec.push_back(n1);
        vec.push_back(n2);
        vec.push_back(n3);
        sets.push_back(vec);
    }

    numb * numbSet = new numb[sets.size()];

    //Since the vectors data is continuous in memory just as the array of structs are
    //you can just copy the data directly
    for (int i = 0; i < sets.size(); i++)
    {
        std::memcpy(&numbSet[i], &sets[i][0], sizeof(numb));
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM