Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将文件中的每列排序为单独的数组_C++_Arrays - Fatal编程技术网

C++ 将文件中的每列排序为单独的数组

C++ 将文件中的每列排序为单独的数组,c++,arrays,C++,Arrays,所以我有一个有六列的文件,第一列是日期,其余的是不同种类的股票信息。(即开盘、收盘、成交量等)我试图将每一列排序为一个数组。以下是我的功能: void load_file(istream& fin, string date[], double open[], double high[], double low[], double close[], int vol[], int& day) { day = 0; while (day &

所以我有一个有六列的文件,第一列是日期,其余的是不同种类的股票信息。(即开盘、收盘、成交量等)我试图将每一列排序为一个数组。以下是我的功能:

void load_file(istream& fin, string date[], double open[], double high[],
               double low[], double close[], int vol[], int& day)
{
    day = 0;
    while (day < MAX_TRADING_DAYS)
    {
        fin >> date[day] >> open[day] >> high[day]
            >> low[day] >> close[day] >> vol[day];
        day++;
    }
}
当我将股票信息的分析输出到另一个文件中时,我得到的是完全无用的值,所以我猜问题在于如何将信息首先显示到数组中。实现这一目标的最佳方式是什么

当我试图显示其中一个数组时,XCode会显示几个不同的数组

此外,该文件最初在每个列的标题开头有一个标题行。我删除了这个,试图弄清楚这个代码是否有效。在从文件中获取信息时,我怎么能忽略第一行呢

谢谢

编辑:当我在调用函数后尝试显示其中一个数组时,XCode会显示几个我不确定如何导航的不同问题

_LIBCPP_INLINE_VISIBILITY
bool __is_long() const _NOEXCEPT
    {return bool(__r_.first().__s.__size_ & __short_mask);}

_LIBCPP_INLINE_VISIBILITY size_type size() const _NOEXCEPT
    {return __is_long() ? __get_long_size() : __get_short_size();}
在每个线程旁边都写着“线程1:EXC\u BAD\u访问(代码=1,地址=0x7fff5fcbdd78)”

您正在修改参数的副本

在C++中,参数按值传递。这意味着将原始变量中内容的副本传递给函数。因此,如果修改参数,则修改的是副本,而不是原始副本

您可以通过两种方式解决此问题:1)通过引用传递或2)通过指针传递。第一种方法允许您修改或访问原始变量,而无需复制。第二种方法允许您更改原始变量的内容,因为您知道它的位置。指针是讨厌的,更喜欢引用

因此,编译器可能会抱怨您正在写入变量的副本,或者变量作为只读变量传递

编辑1:简化建议
通过创建一个结构或类来对文本文件中的行进行建模,可以简化函数签名。通过引用将实例传递给输入函数,或通过引用将
std::vector
传递给输入多行

此外,您应该在结构中重载
运算符>>
,以简化输入循环:

struct Data_Row  
{
  friend std::istream& operator>>(std::istream& input, Data_Row& d);
};

std::istream& operator>>(std::istream& input, Data_Row& d)
{
  // read members of 'd' from 'input'
  return input;
}

//.. your input loop
Data_Row dr;
std::vector<Data_Row> container;
while (input_file >> dr)
{
  container.push_back(dr);
}
struct Data\u行
{
friend std::istream&operator>>(std::istream&input,Data_Row&d);
};
std::istream&operator>>(std::istream&input,数据行与数据行)
{
//从“输入”读取“d”的成员
返回输入;
}
//.. 你的输入循环
数据行dr;
载体容器;
while(输入文件>>dr)
{
容器。推回(dr);
}

如果代码中存在问题,则可能是其他地方的问题(例如,如何分配内存)。下面是一个工作示例,使用您的代码,可以正确读取指定格式的输入

#include <iostream>
#include <fstream>
#include <string>
#include <limits>

#define MAX_TRADING_DAYS 262

using namespace std;

void load_file(istream& fin, string date[], double open[], double high[],
        double low[], double close[], int vol[], int& day)
{
    // Ignore the header row
    fin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

    // Start reading
    day = 0;
    while (day < MAX_TRADING_DAYS)
    {
        fin >> date[day] >> open[day] >> high[day]
            >> low[day] >> close[day] >> vol[day];
        day++;
        if (fin.eof()) break;
    }

    // We will not detect EOF until an extra line has been read, so we compensate.
    day--;
}

// A small function verify that we read correctly.
void dump_file(string* date, double* open, double* high,
        double* low, double* close, int* vol, int& day) {
    for (int i = 0; i < day; i++)
        cout << date[i] << "\t" 
            << open[i] << "\t"
            << high[i] << "\t"
            << low[i] <<  "\t"
            << close[i] <<  "\t"
            << vol[i] << endl;
}


int main(){
    ifstream mystream("Trade.in", std::ifstream::in);

    string* date     = new string[MAX_TRADING_DAYS];
    double* open     = new double[MAX_TRADING_DAYS];
    double* high     = new double[MAX_TRADING_DAYS];
    double* low      = new double[MAX_TRADING_DAYS];
    double* close    = new double[MAX_TRADING_DAYS];
    int* vol         = new int[MAX_TRADING_DAYS];
    int day;

    load_file(mystream, date,open,high,low,close,vol,day); 
    dump_file(date,open,high,low,close,vol,day); 
}
#包括
#包括
#包括
#包括
#定义最大交易天数262
使用名称空间std;
无效加载_文件(istream&fin,字符串日期[],双开[],双高[],
双低[],双收盘[],国际卷[],国际日和国际日)
{
//忽略标题行
fin.ignore(std::numeric_limits::max(),'\n');
//开始阅读
日=0;
期间(日<最大交易日)
{
fin>>日期[日]>>开放[日]>>高位[日]
>>低[日]>>收盘[日]>>交易量[日];
day++;
如果(fin.eof())中断;
}
//在读取额外的行之前,我们不会检测EOF,因此我们会进行补偿。
天——;
}
//一个小函数验证我们的读取是否正确。
无效转储文件(字符串*日期,双*打开,双*高,
双*低,双*关,整数*音量,整数和天数){
对于(int i=0;i你的文件是如何分隔的?下面是一个典型的行是什么样子的:3-Mar-141206.751207.841192.141202.692108720总共有262个交易日,所以只有262行的确切设置。注释不支持换行,请用相关的格式编辑你的问题。很明显,你能在当您将它们读取到控制台或其他文件时的确切时间?您是否可以--但愿如此--调试?我怀疑您传递到
load\u file
的参数没有足够的空间来保存数据。不幸的是,我被限制在这个项目中严格使用数组和文件I/O(这是为学校准备的)所以我不认为我能做到这一点。但是谢谢你的回答!另外,我在课堂上的印象是数组不使用按值传递,而是类似于按引用传递。你能再解释一下,在这种情况下,按引用传递会有什么帮助吗?数组不按值传递,所以我怀疑这是问题所在相对长度单位。
#include <iostream>
#include <fstream>
#include <string>
#include <limits>

#define MAX_TRADING_DAYS 262

using namespace std;

void load_file(istream& fin, string date[], double open[], double high[],
        double low[], double close[], int vol[], int& day)
{
    // Ignore the header row
    fin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

    // Start reading
    day = 0;
    while (day < MAX_TRADING_DAYS)
    {
        fin >> date[day] >> open[day] >> high[day]
            >> low[day] >> close[day] >> vol[day];
        day++;
        if (fin.eof()) break;
    }

    // We will not detect EOF until an extra line has been read, so we compensate.
    day--;
}

// A small function verify that we read correctly.
void dump_file(string* date, double* open, double* high,
        double* low, double* close, int* vol, int& day) {
    for (int i = 0; i < day; i++)
        cout << date[i] << "\t" 
            << open[i] << "\t"
            << high[i] << "\t"
            << low[i] <<  "\t"
            << close[i] <<  "\t"
            << vol[i] << endl;
}


int main(){
    ifstream mystream("Trade.in", std::ifstream::in);

    string* date     = new string[MAX_TRADING_DAYS];
    double* open     = new double[MAX_TRADING_DAYS];
    double* high     = new double[MAX_TRADING_DAYS];
    double* low      = new double[MAX_TRADING_DAYS];
    double* close    = new double[MAX_TRADING_DAYS];
    int* vol         = new int[MAX_TRADING_DAYS];
    int day;

    load_file(mystream, date,open,high,low,close,vol,day); 
    dump_file(date,open,high,low,close,vol,day); 
}