C ++:如何让动态数组的索引由文件中的行决定

时间:2012-11-23 20:31:32

标签: c++ arrays dynamic io

我正在尝试制作三个动态数组,其索引由文本文件中的行数决定。然后我需要使其索引值可修改。我在想全球阵列是我最好的选择。

由于某种原因,我一直收到以下编译器错误:               secondLab.obj:错误LNK2019:未解析的外部符号“void __cdecl arrayInput(...)

问题,我该如何解决这个问题并基本达到我的计划的目标。

这是我的代码:

#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
#include <new>

using namespace std;

int INDEXES = 0;

string *names_Array = new string[INDEXES];
double *rates_Array = new double[INDEXES];
double *hours_Array = new double[INDEXES];

void subscript(ifstream&, int&, string&, double&, double&);
void arrayInput(istream&, string [], double [], double[],
     string&, double&, double&);

int main ()
{
    string names;
    double rates;
    double hours;

    string filename("employee sample file.txt");
    ifstream employeeInfo(filename.c_str());

    if (employeeInfo.fail())
    {
        cout << "Sorry, file was not successfully opened. "
             << "Please make sure your file exists and\n" 
             << "re-run the program." << endl;
    }   

    subscript(employeeInfo, INDEXES, names, rates, hours);

    arrayInput(employeeInfo, names_Array, rates_Array, hours_Array,
    names, rates, hours);

    cout << names_Array[0] << endl
         << names_Array[1] << endl
         << names_Array[2] << endl
         << names_Array[3] << endl
         << names_Array[4] << endl;

    delete[] names_Array;
    delete[] rates_Array;
    delete[] hours_Array;

    system("pause");
    return 0;
}

void subscript(ifstream& employeeInfo, int& INDEXES,
    string& names, double& rates, double& hours)
{
    while(!employeeInfo.eof())
    {   
        employeeInfo >> names >> rates >> hours;

        INDEXES++;
    }
}

void arrayInput(ifstream& employeeInfo, string names_Array[], 
    double rates_Array[], double hours_Array[], string& names, double& rates, double& hours)
{
    int i = 0;

    while(!employeeInfo.eof())
    {
        employeeInfo >> names >> rates >> hours;

        names_Array[i] = names;
        rates_Array[i] = rates;
        hours_Array[i] = hours;

        i++;
    }
}

3 个答案:

答案 0 :(得分:2)

arrayInput的声明和定义不匹配,具体一个采用ifstream参数,另一个采用istream。变化

void arrayInput(istream&, string [], double [], double[],
 string&, double&, double&);

void arrayInput(ifstream&, string [], double [], double[],
 string&, double&, double&);

答案 1 :(得分:1)

你可以先计算行数......然后启动数组..并将数据填充到数组中。

 subscript(employeeInfo, INDEXES, names, rates, hours);
 names_Array = new string[INDEXES];
 rates_Array = new double[INDEXES];
 hours_Array = new double[INDEXES];
 arrayInput(employeeInfo, names_Array, rates_Array, hours_Array,names, rates, hours);

试试这个..

答案 2 :(得分:1)

关于链接错误的问题已在@jrok的评论中得到解答。然而,您的问题的主题是“如何让动态数组的索引由文件中的行确定”,并且您似乎通过遍历文件两次来完成此操作。这不是任何方式的“最佳”解决方案,甚至对某些流(例如终端输入)也不可能。

std::vector不仅是“你最好的选择”(正如@jrok所指出的那样),而且对于标题问题也是更好的解决方案。事实上,整个代码是几行,没有丑陋的全局“动态”数组。 (更不用说你的实现是错误的,因为这些数组永远不会分配给INDEXES>0),更干净,更快(单遍历):

#include <vector>
#include <fstream>

int main () {
   using namespace std;
   vector<string> names;
   vector<double> rates;
   vector<double> hours;

   ifstream file("employee sample file.txt");

   while( !file.eof() ) {
      string name;
      double rate, hour;
      file >> name >> rate >> hour >> ws;
      names.push_back(name);
      rates.push_back(rate);
      hours.push_back(hour);
   }
}

注意:

  • push_back()是分摊的常量时间。所以,不要担心效率
  • std :: ws是在迭代开始之前跳过任何尾随空格(例如文件中的尾随行)。
  • 没有弄乱delete[]new所有垃圾。

HTH