0

テキスト ファイルの行数によってインデックスが決定される 3 つの動的配列を作成しようとしています。次に、それらのインデックス値を変更可能にする必要があります。グローバル配列が私の最善の策だと思っていました。

何らかの理由で、次のコンパイラ エラーが発生し続けます: secondLab.obj : error LNK2019: unresolved external symbol "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++;
    }
}
4

3 に答える 3

2

の宣言と定義がarrayInput一致しません。具体的には、一方がifstreamパラメーターを取り、もう一方がistream. 変化する

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

void arrayInput(ifstream&, string [], double [], double[],
 string&, double&, double&);
于 2012-11-23T20:42:49.117 に答える
1

リンケージ エラーに関するあなたの質問は、@jrok のコメントですでに回答されています。それでも、あなたの質問の主題は「動的配列のインデックスをファイル内の行によって決定する方法」であり、ファイルを2回トラバースしてこれを行ったようです。これは決して「最良の」解決策ではなく、一部のストリーム(端末入力など)では不可能ですらありません。

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

h番目

于 2012-11-23T21:06:43.480 に答える
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);

このようにしてみてください..

于 2012-11-23T20:45:21.973 に答える