I'm trying to make three dynamic arrays whose indexes are determined by the number of lines in a text file. I then need to make their index values modifiable. I was thinking that global arrays would be my best bet.
For some reason I keep receiving the following compiler error: secondLab.obj : error LNK2019: unresolved external symbol "void __cdecl arrayInput(...)
Question, how do I fix this and basically meet the goal of my program.
Here's my code:
#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++;
}
}
The declaration and definition of arrayInput
do not match, specifically one takes an ifstream
paramater and the other takes an istream
. Change
void arrayInput(istream&, string [], double [], double[],
string&, double&, double&);
to
void arrayInput(ifstream&, string [], double [], double[],
string&, double&, double&);
u can count the numbers of lines at first .. then initiate the arrays .. and filling data to arrays..
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);
try like this ..
Your question about the linkage error is already answered in comments by @jrok. Yet, the subject of your question is "How to let the indexes of an dynamic array be determined by lines in a file", and you seem to have done this by traversing the file twice. This not "best" solution by any means, and not even possible for some streams (eg terminal input).
std::vector
is not only "your best bet" (as @jrok indicated) but also is the better solution for the question of the title. In fact, the whole code is a few lines, without the ugly global "dynamic" arrays. (not to mention your implementation is wrong, as these arrays are never allocated to INDEXES>0
), cleaner, and faster (single traversal):
#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);
}
}
Notes:
delete[]
, new
all that junk. hth
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.