我检查了所有文件之间的连接,以及类和函数定义,但每次我尝试运行我的程序时它都会阻止我并告诉我它有"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;
}
Run Code Online (Sandbox Code Playgroud)
这是我的"学生"课程(头文件):
#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;
};
Run Code Online (Sandbox Code Playgroud)
最后,我的班级功能:
#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;
}
Run Code Online (Sandbox Code Playgroud)
任何帮助都会如此惊人!
编辑:这是出现的错误消息:
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
Run Code Online (Sandbox Code Playgroud)
您正在尝试使用标准入口点(int main())编译程序作为Windows GUI应用程序,并且Windows GUI应用程序需要
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow)
Run Code Online (Sandbox Code Playgroud)
代替.
将您的入口点更改为此对您来说无济于事,因为您正在尝试编译(在Visual Studio世界中称为"控制台程序").设置项目时,可以选择创建控制台项目.你可以废弃你已经获得的那个并创建一个新的控制台项目来粘贴代码以便于修复.如果您真的依附于当前项目,则可以修复它.
在项目设置中:在Configuration Properties> C/C++> Preprocessor下,更改_WINDOWS; 预处理器定义中的字符串为_CONSOLE; 在Configuration Properties> Linker> System下,将SubSystem更改为Console.