将结构矢量保存到制表符分隔的文本文件中

时间:2015-09-07 17:06:30

标签: c++ parsing text

我正在阅读一个2到4 GB的.txt文件,然后我操作了一些数据,并希望将我的struct vector保存为制表符分隔的.txt文件。我读了一些其他的问题,但仍然不清楚我将如何在我的程序中这样做。

所以我的问题是:如何将Input向量结果保存为制表符分隔的.txt文件?

以下是我的代码:

#include <iostream>
#include <sstream>
#include <string>
#include <fstream>
#include <vector>
#include <cstdio>

using namespace std;

struct Input_Spec {
    std::string Data;
    std::string Ativo;
    int Buy_Sell;
    double Sequencia;
    double Id;
    int Event;
    std::string Hr_Priority;
    double Priority;
    double Price;
    double Qtd_Total;
    double Qtd_Traded;
    std::string Data_Order;
    std::string Data_Time_Order;
    std::string State_Of_Order;
    std::string Condition_Of_Order;
    double Broker;
};

void split(const std::string &s, char delim, std::string elems[])
{
    std::stringstream ss(s);
    std::string item;

    long i = 0;

    while (std::getline(ss, item, delim))
    {
        elems[i++] = item;
    }
}

int main()
{    
    ifstream infile1("C:\\Teste\\Teste.txt");     
    ofstream output("output.txt");

    string word;
    string columns[16];

    string line;
    int row=0;
    long c=0;
    long filescol=0;

    for (int i = 0; std::getline(infile1, word); ++i)
    {
        row++;
    }

    //cout<<row;

    infile1.close();

    ifstream infile("C:\\Teste\\Teste.txt"); 

    vector<Input_Spec> Input(row);

    while( getline(infile, line))
    {
        split(line,';', columns);

        if (columns[0]!="")
        {
            Input[filescol].Data      =columns[0];
            Input[filescol].Ativo     =columns[1];
            Input[filescol].Buy_Sell   = stoi(columns[2]);
            Input[filescol].Sequencia = stod(columns[3]);
            Input[filescol].Id = stod(columns[4]);
            Input[filescol].Event = stoi(columns[5]);
            Input[filescol].Hr_Priority = columns[6];
            Input[filescol].Priority = stod(columns[7]);
            Input[filescol].Price = stod(columns[8]);
            Input[filescol].Qtd_Total = stod(columns[9]);
            Input[filescol].Qtd_Traded = stod(columns[10]);
            Input[filescol].Data_Order = columns[11];
            Input[filescol].Data_Time_Order = columns[12];
            Input[filescol].State_Of_Order = columns[13];
            Input[filescol].Condition_Of_Order = columns[14];
            Input[filescol].Broker = stod(columns[15]);

            filescol++;
            c++;
        }

        if (c>(999))
        {   
            break;
            infile.close();
            return 0;
        }
    }

    infile.close();
    return 0;
}

2 个答案:

答案 0 :(得分:1)

这是一个片段:

ofstream output ("output.txt");
output << Input[filescol].Data << '\t';
output << Input[filescol].Ativo << '\t';
output << Input[filescol].Buy_Sell << '\t';
//...
output << Input[filescol].Broker << '\n';

这就是你在说什么吗?

答案 1 :(得分:0)

首先,请让我给你一些关于你的代码的提示:你不需要计算输入文件的所有行,你也不需要为你{{{中的所有项目保留内存1}}事先。您可以使用vector功能将项目添加到push_back()。这样可以节省输入文件的一次迭代。

我将此改进放在下面的vector函数中。我还对@ThomasMatthews的答案进行了一些扩展,以便您可以看到如何循环main()以便将数据保存在其中:

vector

我想可以对您的代码进行更多改进,但这应该会给您一个良好的开端。