I've checked the connections between all of my files, as well as Class and Function definitions, but every time I try to run my program it stops me and tells me that it has "1 unresolved externals".
The program is supposed to open up multiple files (A "student" file, and a "grades" file), read from them, and then use a "query file" to look through the data, find the students asked for in the query file, and print it to a new file. Confusing? Yes.
Still, I'm pretty close to a solution, but because I'm using Visual Studio it won't even let me run the program until I find and put an end to the "1 unresolved externals". It won't even tell me where the error is. I'm fairly new to C++, and no matter how hard I search, I can't seem to remedy the issue.
Here's my Main Program:
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <fstream>
#include "Student.h"
using namespace std;
int main(){
//Request a file to read from, and open it (I haven't declared the files yet, don't worry about that)
ifstream input_file;
string studentfile = "";
string gradefile = "";
string queryfile = "";
//Create a Map for the Students
map<string, Student *> student_map;
//Open the Student file and load it in
cout << "Loading \"" << studentfile << "\"... " <<endl;
input_file.open(studentfile);
//Look for:
string id_number;
string name;
string address;
string phone;
//Boolean value to check for duplicate students
bool duplicate = false;
//Check to see if the Student File is empty
if (!input_file.eof()){
while (input_file.good()){
//Get the ID Number
input_file.get();
getline (input_file, id_number);
//Sort through and make sure there are no duplicate students
for (map<string, Student *>::iterator counter = student_map.begin(); counter != student_map.end(); counter ++){
if (counter->first == id_number ){
duplicate = true;
counter = student_map.end();
}
}
if (duplicate != true){
//Get the name
input_file.get();
getline (input_file, name);
//Get the Address
input_file.get();
getline (input_file, address);
//Get the Phone Number
input_file.get();
getline (input_file, phone);
//Create a new student
Student * newStudent = new Student (id_number, name, address, phone);
//Add it to the map (referenced by the ID number)
student_map[id_number] = newStudent;
}
}
}
else {
return 0;
}
input_file.close();
//Open the Grades file and load it in
cout << "Loading \"" << gradefile << "\"... " <<endl;
input_file.open(gradefile);
//Look for (id_number already defined):
string course;
string grade;
if (!input_file.eof()){
while (input_file >> course >> id_number >> grade){
//Find the student referenced
Student* current_student = student_map[id_number];
//Calculate their grade points and add them to their grade point vector
current_student ->add_grade_points(current_student ->check_grade_points(grade));
}
}
else {
return 0;
}
input_file.close();
//Open the Query file and load it in
cout << "Loading \"" << queryfile << "\"... " << endl;
input_file.open(queryfile);
if (!input_file.eof()){
//Write to
ofstream output_file ("report.txt");
//No need to "Look for" anything, id_number alread defined
//If the file is open, write to it
if (output_file.is_open())
{
while (input_file >> id_number)
{
//Print the ID Number (With four spaces)
output_file << id_number << " ";
//Print out the GPA (With four spaces)
Student* current_student = student_map[id_number];
output_file << current_student->get_gpa() << " ";
//Print out the student's name (Then end that line)
output_file << current_student->get_name() << endl;
}
}
input_file.close();
output_file.close();
}
else {
return 0;
}
cout << endl;
cout << "File Printed.";
return 0;
}
Here's my "Student" Class (Header File):
#pragma once
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <fstream>
#include <map>
using namespace std;
class Student
{
public:
Student (string _id_number, string _name, string _address, string _phone);
void add_grade_points (double grade_points);
double check_grade_points (string grade);
double get_gpa () const;
string get_name () const;
private:
string id_number;
string name;
string address;
string phone;
vector <double> grade_points;
};
And finally, my class functions:
#include "Student.h"
Student::Student (string _id_number, string _name, string _address, string _phone){
id_number = _id_number;
name = _name;
address = _address;
phone = _phone;
}
void Student::add_grade_points (double new_grade_point){
grade_points.push_back(new_grade_point);
}
double Student::check_grade_points (string grade) {
if (grade == "A")
return 4.0;
else if (grade == "A-")
return 3.7;
else if (grade == "B+")
return 3.4;
else if (grade == "B")
return 3.0;
else if (grade == "B-")
return 2.7;
else if (grade == "C+")
return 2.4;
else if (grade == "C")
return 2.0;
else if (grade == "C-")
return 1.7;
else if (grade == "D+")
return 1.4;
else if (grade == "D")
return 1.0;
else if (grade == "D-")
return 0.7;
else
return 0.0;
}
double Student::get_gpa() const{
//Add up all of the grade points
double total = 0;
for (int i = 0; i < grade_points.size(); i++) {
total = total + grade_points[i];
}
//Calculate the Grade Point Average
double gpa = total/grade_points.size();
return gpa;
}
string Student::get_name() const{
return name;
}
Any help would be so amazing!
EDIT: Here's the error message that comes up:
1>MSVCRTD.lib(crtexew.obj) : error LNK2019: unresolved external symbol _WinMain@16 referenced in function ___tmainCRTStartup
1>C:\Users\Student\Documents\Visual Studio 2010\Projects\CS235 Project 1\Debug\CS235 Project 1.exe : fatal error LNK1120: 1 unresolved externals
You are trying to compile a program with the standard entry point (int main()) as a windows GUI application, and Windows GUI applications require
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow)
Instead.
Changing your entry point to this won't help you though, as you're trying to compile (what's called in the Visual Studio world) a 'console program'. When you set up the project, there would have been an option to create a console project. You can scrap the one you've got and create a new console project to paste your code into for an easy fix. If you're really attached to your current project though, you can fix it.
In the project settings: Under Configuration Properties > C/C++ > Preprocessor, change the _WINDOWS; string in the Preprocessor definitions to _CONSOLE; and under Configuration Properties > Linker > System, change the SubSystem to Console.
That's a linker error. You are calling a function and when it come's time to link the program together, the linker can't find the function to link.
You are probably missing a library or source file.
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.