所以我有一个包含六列的文件,第一列是日期,其余的是不同种类的库存信息。 (即打开,关闭,交易量等)我试图将每列排序成一个数组。这是我的职责:
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++;
}
}
以下是该文件的典型行(总共262行,对应max_trading_days
):
3-Mar-14 1206.75 1207.84 1192.14 1202.69 2108720
当我将股票信息的分析输出到另一个文件中时,我完全得到了垃圾值,因此我猜测问题是如何将信息看到数据库中第一名。什么是实现这一目标的最佳方式?
当我尝试显示其中一个数组时,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();}
其中每一个都显示&#34;线程1:EXC_BAD_ACCESS(代码= 1,地址= 0x7fff5fcbdd78)&#34;
答案 0 :(得分:0)
您正在修改参数的副本。
在C ++中,参数按值传递。这意味着原始变量中的内容副本将传递给该函数。因此,如果您修改参数,则表示您正在修改副本,而不是原始副本。
您可以通过两种方式解决这个问题:1)通过引用传递或2)通过指针传递。第一种方法允许您修改或访问原始变量而无需复制。第二种方法允许您更改原始变量的内容,因为您知道它的位置。指针很讨厌,更喜欢参考。
因此,编译器可能会抱怨您正在写入变量的副本,或者变量是作为只读变量传递的。
编辑1:简化建议
您可以通过创建结构或类来模拟文本文件中的行来简化函数签名。通过引用将实例传递给输入函数,或者通过引用传递std::vector
以输入多行。
此外,您应该在结构中重载operator>>
以简化输入循环:
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);
}
答案 1 :(得分:0)
如果代码中存在问题,则可能在其他地方(例如,如何分配内存)。下面是一个使用您的代码的工作示例,它以您指定的格式正确读取输入。
#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);
}