Spectrum10 2021-05-23 14:46 采纳率: 100%
浏览 32
已采纳

请问这个C++程序如何实现将数据添加到源文件相应行的末尾呢?

#include <iostream>
#include <fstream>
#include <string>
#include "filedetail.h"
#include <cstdlib>
#include <vector>
#include <string.h>
using namespace std;
vector<filedetail> a;
void cg();
void fout();
int main()
{
    ifstream infile("all_zh_stock_daily.csv");//这里写读取的文件名字
    char* temp;
    char *token;
    char seps[] =",\n\t";
    FILE *fp;
    fp = fopen("output.csv","w+");
    fprintf(fp,"date,symbol,open,high,low,close,volume,outstanding_share,turnover,change_amount,quote_amount");
    fclose(fp);
    string tempinfile;
    string tempdate;
    string tempsymbol;
    float tempopen;
    float temphigh;
    float templow;
    float tempclose;
    float tempvolume;
    float tempoutstanding;
    float tempturnover;
    string tempsymbol2;
    filedetail *temp1;
    //int test=0;
    if(!infile.is_open())
        cout<< "no this file" << endl;
    getline(infile,tempinfile);
    while(!infile.eof())
    {
        filedetail *tempfd;
        getline(infile,tempinfile);
        temp = (char*)tempinfile.data();
        token = strtok(temp,seps);
        tempdate = token;
        token = strtok(NULL,seps);
        tempsymbol = token;
        token = strtok(NULL,seps);
        tempopen = atof(token);
        token = strtok(NULL,seps);
        temphigh = atof(token);
        token = strtok(NULL,seps);
        templow = atof(token);
        token = strtok(NULL,seps);
        tempclose = atof(token);
        token = strtok(NULL,seps);
        tempvolume = atof(token);
        token = strtok(NULL,seps);
        tempoutstanding = atof(token);
        token = strtok(NULL,seps);
        tempturnover = atof(token);
        tempfd = new filedetail(tempdate,tempsymbol,tempopen,temphigh,templow,tempclose,tempvolume,tempoutstanding,tempturnover);
        a.push_back(*tempfd);
        //cin.ignore(numeric_limits<streamsize>::max());
        if(tempsymbol2.compare(tempsymbol))
        {
            //test ++;
            cg();
            fout();
            a.clear();
            /*if(test == 50000)
            {
                return 0;
            }*/
        }
        tempsymbol2 = tempsymbol;

    }
    return 0;
}


void cg() //set every change_amount
{
    float cg_am=0.0;
    float qc=0.0;
    for(int i = 0; i<=a.size(); i++)
    {
        filedetail *a1;
        filedetail *a2;
        a1 = &a[i];
        string s1;
        s1 = a1->getsymbol();
        a2 = &a[i+1];
        if(i==0)
        {
         a1->setchange_amount(0);
         a1->setQuote_change(0);
        }
        if(s1.compare(a2->getsymbol()));
        {
            cg_am =a2->getclose() - a1->getclose();
            a2->setchange_amount(cg_am);
            qc = cg_am - a1->getclose();
            qc = qc;
            a2->setQuote_change(qc);
        }
    }
}

void fout()
{
    FILE *fp;
    fp = fopen("all_zh_stock_daily.csv","w+");
    filedetail *temp;
    char *tempout;
    string tempt;
    //fprintf(fp,"date,symbol,open,high,low,close,volume,outstanding_share,turnover,change_amount,quote_change");
    for(int i = 0;i<a.size();i++)
    {
        temp = &a[i];
        tempt = temp->tostring();
        tempout = (char*)tempt.data();
        fprintf(fp,"\n");
        fprintf(fp,tempout);
        fprintf(fp,"%%");
        temp = new filedetail();
        delete temp;
    }
    fclose(fp);
}



#include "filedetail.h"
#include <string>
#include <sstream>
#include <iostream>
#include "stdtostring.h"
using namespace std;


float filedetail::getopen(void)
{
    return open;
}

float filedetail::gethigh(void)
{
    return high;
}

float filedetail::getlow(void)
{
    return low;
}

float filedetail::getclose(void)
{
    return close;
}

filedetail::filedetail(std::string i_data,std::string i_symbol,float i_open,float i_high,float i_low,float i_close,float i_volume,float i_oustanding,float i_turnover)
{
    this->data = i_data;
    this->symbol = i_symbol;
    this->open = i_open;
    this->low = i_low;
    this->high = i_high;
    this->close = i_close;
    this->volume = i_volume;
    this->outstanding = i_oustanding;
    this->turnover = i_turnover;
}
filedetail::setchange_amount(float cg)
{
    this->change_amount = cg;
}
string filedetail::getsymbol(void)
{
    return this->symbol;
}
filedetail::filedetail()
{

}

float filedetail::getchange_amount(void)
{
    return this->change_amount;
}

filedetail::setQuote_change(float qc)
{
    this->quote_change = qc;
}
float filedetail::getQuote_change(void)
{
    return this->quote_change;
}
string filedetail::tostring()
{
    string re;
    re.append(this->data);
    re.append(",");
    re.append(this->symbol);
    re.append(",");

    string strfloat = to_string(this->open);
    re.append(strfloat);
    re.append(",");
    strfloat = to_string(this->high);
    re.append(strfloat);
    re.append(",");
    strfloat = to_string(this->low);
    re.append(strfloat);
    re.append(",");
    strfloat = to_string(this->close);
    re.append(strfloat);
    re.append(",");
    strfloat =  to_string(this->volume);
    re.append(strfloat);
    re.append(",");
    strfloat =  to_string(this->outstanding);
    re.append(strfloat);
    re.append(",");
    strfloat =  to_string(this->turnover);
    re.append(strfloat);
    re.append(",");
    strfloat = to_string(this->change_amount);
    re.append(strfloat);
    re.append(",");
    strfloat = to_string(this->quote_change);
    re.append(strfloat);
    //这一串代码都是输出格式的设置

    return re;
    //this->data + "," + this->symbol + "," + this->change_amount + "," + this->quote_change;
}
/*filedetail::~filedetail()
{
    //dtor
}*/

rt...以上是一个从股票文件中读取数据的程序,这个程序要求计算两个数值并且添加到文件末尾。

但是我只想出来了怎么重开一个文件并且把数据写进去的方法……怎么把那两个数值添加到all_zh_stock_daily.csv文件相关的数据后面啊???

数据示例:

date,symbol,open,high,low,close,volume,outstanding_share,turnover
1999-11-10,sh600000,2.2,2.22,2.01,2.07,174085100.0,320000000.0,0.5440159375
1999-11-11,sh600000,2.06,2.12,2.05,2.07,29403500.0,320000000.0,0.0918859375

要算出两个数添加到最后面成为两列……

PS:这个数据很大很大,非常吃内存(

谢谢各位大佬!

  • 写回答

3条回答 默认 最新

  • 关注

    把指针移到文件末尾,使用fseek方法的SEEK_END常量,如下:

    FILE *f;
    f=fopen("/*your file path*/")
    fseek(f, 0, SEEK_END);

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置