我已经检查了所有文件之间的连接,以及类和函数定义,但每次我尝试运行我的程序时它都会阻止我并告诉我它有“1个未解析的外部”。
该程序应该打开多个文件(一个“学生”文件和一个“成绩”文件),从中读取,然后使用“查询文件”查看数据,找到学生要求的在查询文件中,并将其打印到新文件。混乱?是。
尽管如此,我还是非常接近解决方案,但是因为我使用的是Visual Studio,所以在找到并结束“1个未解析的外部”之前,它甚至不会让我运行该程序。它甚至不会告诉我错误在哪里。我对C ++很陌生,无论我搜索多么难,我似乎无法解决这个问题。
这是我的主要计划:
#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;
}
这是我的“学生”课程(头文件):
#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;
};
最后,我的课程功能:
#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;
}
任何帮助都会如此惊人!
编辑:这是出现的错误消息:
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
答案 0 :(得分:7)
您正在尝试使用标准入口点(int main())编译程序作为Windows GUI应用程序,并且Windows GUI应用程序需要
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow)
相反。
更改您的入口点对您来说无济于事,因为您正在尝试编译(在Visual Studio世界中称为“控制台程序”)。设置项目时,可以选择创建控制台项目。你可以废弃你已经获得的那个并创建一个新的控制台项目来粘贴代码以便于修复。如果您真的依附于当前项目,可以修复它。
在项目设置中: 在配置属性&gt;下C / C ++&gt;预处理器,更改_WINDOWS;预处理器定义中的字符串为_CONSOLE; 在配置属性&gt;下链接器&gt;系统,将SubSystem更改为Console。
答案 1 :(得分:2)
这是一个链接器错误。您正在调用一个函数,当它将程序链接在一起时,链接器找不到要链接的函数。
您可能缺少图书馆或源文件。