【问题标题】:Save a Struct Vector into a Tab delimited Text File将结构向量保存到制表符分隔的文本文件中
【发布时间】:2015-09-07 17:06:30
【问题描述】:

我正在读取一个 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;
}

【问题讨论】:

  • 答案是否在这里:StackOverflow c++ read file structure?
  • 如何将输入向量保存为制表符分隔的 .txt 文件
  • 单独写入每个结构成员,后跟一个制表符。我错过了什么吗?
  • This question 并不是真正的重复,而只是问题本身应该作为您的答案。
  • 您的代码很危险。你在哪里检查split 不会溢出数组elems?我建议你使用std::vector&lt;std::string&gt;push_back

标签: c++ parsing text


【解决方案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';

你说的是这个吗?

【讨论】:

  • 是的,但是如何保存所有行和所有列,这样它只保存最后一行。有没有办法保存向量结构的第n列?
  • 你知道如何使用for 循环吗?看起来您需要查看有关数组和向量的 C++ 文本。大多数文本都会提供有关如何访问数组或向量中所有元素的示例。
  • 对c++不太熟悉。不过谢谢你的帮助
  • 让我们回顾一下。 Array[0] 表示第一个元素。 Array[1] 表示第二个元素。通过电感,Array[n-1] 表示数组中的第 n 项。使用替换,Input[n-1] 表示数组中的第 n 个元素。要访问某个字段,请使用Input[n-1].field
  • @QuantInvest:如果你不是很熟悉 C++,我建议你get熟悉它(有很多好书和在线教程),或使用您相当熟悉的语言。令人惊讶的是,使用您知道如何使用的语言会使编程变得容易得多。
【解决方案2】:

首先,请让我对您的代码进行一些提示:您不需要计算输入文件的所有行,也不需要预先为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;
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-30
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    相关资源
    最近更新 更多