2015-11-03 58 views
0

我有看起来像这样数据读入从文件

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? 
     } 
    } 
} 
+0

与此问题相关的StackOverflow上有很多(可能是数百个)问题和答案。您是否尝试过搜索以找到相关问题?注意:搜索框位于'help'链接的右侧。另外,如果您搜索了Google,您可能会收到5到10个链接,导致SO问题。 –

+1

[从C++中的文本文件中读取数字数据]的可能重复(http://stackoverflow.com/questions/14516915/read-numeric-data-from-a-text-file-in-c) –

回答

-1

你或许应该能够做这样的事情:

#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)); 
    } 
} 
+1

使用'memcpy'和原始指针是无偿的。只需直接读入'numb'结构的成员并将它们推送到vector上。在这里,你需要再做几次数据拷贝,并且引入容易出错的原始指针和C风格的'memcpy'。 – legalize

+0

根据用户提问#我需要创建一个struct_数组。解决方案对于一个向量来说是微不足道的。我相信这些数据最终只会被复制一次。 – GDub

0

使用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); 
    } 
} 

Express your ideas directly in code尽可能。

注意我已经写了代码,假定文件的格式正确。如果每行的值太多或太少,那么上面的代码将会混淆。但是,最好编写simplest thing that could possibly work并在需要时考虑复杂性。在你的例子中,你说输入文件是格式良好的,所以不需要过分复杂的东西。

0

我建议使用这个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的parse出的数据类型,你只需要解析出3个int s,它可以与你的结构使用。然后你将结构体推入你的向量中。

下面是工作ideone从标准输入的输入。