保存一个结构向量到一个Tab分隔的文本文件

Save a Struct Vector into a Tab delimited Text File

本文关键字:一个 文本 文件 分隔 结构 保存 向量 Tab      更新时间:2023-10-16

我正在阅读一个2到4 gb的。txt文件,然后我操纵一些数据,并希望将我的结构向量保存为一个制表符分隔的。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;
}

这是一个片段:

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';

这就是你在说的吗?

首先,请让我给你一些关于代码的提示:你不需要计算输入文件的所有行,也不需要事先为vector中的所有项保留内存。可通过push_back()功能向vector中添加项目。这为输入文件节省了一次迭代。

我把这个改进放到下面的main()函数中。我还对@ThomasMatthews的答案进行了一些扩展,这样你就可以看到如何循环vector以保存其中的数据:

int main()
{
    ifstream infile("C:\Teste\Teste.txt"); 
    ofstream output("C:\Teste\output.txt");
    string line;
    string columns[16];
    vector<Input_Spec> Input;
    Input_Spec oneInput;
    while (getline(infile, line))
    {
        split(line, ';', columns);
        if (!columns[0].empty())
        {
            oneInput.Data               = columns[0];
            oneInput.Ativo              = columns[1];
            oneInput.Buy_Sell           = stoi(columns[2]);
            oneInput.Sequencia          = stod(columns[3]);
            oneInput.Id                 = stod(columns[4]);
            oneInput.Event              = stoi(columns[5]);
            oneInput.Hr_Priority        = columns[6];
            oneInput.Priority           = stod(columns[7]);
            oneInput.Price              = stod(columns[8]);
            oneInput.Qtd_Total          = stod(columns[9]);
            oneInput.Qtd_Traded         = stod(columns[10]);
            oneInput.Data_Order         = columns[11];
            oneInput.Data_Time_Order    = columns[12];
            oneInput.State_Of_Order     = columns[13];
            oneInput.Condition_Of_Order = columns[14];
            oneInput.Broker             = stod(columns[15]);
            Input.push_back(oneInput);
        }
    }
    // ----------------------
    // Modify your data here.
    // ----------------------
    for(vector<Input_Spec>::const_iterator it = Input.begin(); it != Input.end(); it++)
    {
        output << it->Data               << 't';
        output << it->Ativo              << 't';
        output << it->Buy_Sell           << 't';
        output << it->Sequencia          << 't'; 
        output << it->Id                 << 't';
        output << it->Event              << 't';
        output << it->Hr_Priority        << 't';
        output << it->Priority           << 't';
        output << it->Price              << 't';
        output << it->Qtd_Total          << 't';
        output << it->Qtd_Traded         << 't';
        output << it->Data_Order         << 't';
        output << it->Data_Time_Order    << 't';
        output << it->State_Of_Order     << 't';
        output << it->Condition_Of_Order << 't';
        output << it->Broker             << 'n';
    }
    output.close();
    infile.close();
    return 0;
}

我猜你的代码还可以做更多的改进,但这应该给你一个好的开始。

相关文章: