我正在为学校做一个项目。它相对简单,至少它似乎是:取一个文件(命名为sd,或学生数据,在下面我的代码的命名法中),其中包含学生ID数据并将其与文件二进行比较(名为hc,我的名字)学院)。文件二包含我所在学院所有活动课程的列表,并且包含文件一中未包含的其他信息:每个课程的课程时数,以及表示课程类型的特殊代码。目标是复制学生ID文件中的所有数据,并在每行附加相关的课程时间和特殊代码。以下是一个例子:
文件1(SD)中的一行样本:
20424297 1142 PSYCH 22000 W -1
文件2(HC)中的一行样本:
PSYCH 22000 3.0 RLA
目标是从SD获取6k行,将其与来自HC的课程数据(大约13k行)匹配,并在第三个文件中输出另外6k,如下所示:
20424297 1142 PSYCH 22000 W -1 3.0 RLA
我们的课程是一门相对介绍性的CS课程,我们只接触过CS和C ++中的一些基本概念。该项目旨在仅使用我们讨论过的非常基本的想法(文件流,循环,循环等)来解决。所以经过深思熟虑,我意识到一系列嵌套的while循环应该能够解决这个问题。将一个while循环激活,同时将数据从文件1的输入流填充到变量中,并使另一个while循环处于活动状态,打开文件二,搜索整个数据,并在匹配时输出一行。我知道,为文件1的每一行打开并搜索整个文件2的效率有点低,但是我们的教授明确指出速度和效率不是此任务的优先级。
以下是我在下面创建的代码:
#include <fstream>
#include <iostream> // INCLUDED FOR TESTING ERROR STATEMENTS
using namespace std;
int main ()
{
ifstream sdStream;
ifstream hcStream;
ofstream outputStream;
sdStream.open ("StudentData.tsv"); // use this to take in data from SD file
hcStream.open ("HunterCourses.tsv"); // use this to open stream for HC file
outputStream.open("File1.tsv"); // this will be the csombine data file created by this output stream.
//Student Data String Objects
string eiD;
string semester;
string subject;
string coursenumSD;
string grade;
string gradeNum;
//Hunter College Data String Objects
string subjectHC;
string coursenumHC;
double gpaHC;
string codeHC;
// bool streamactive = sdStream >> eiD >> semester >> subject >> coursenumSD >> grade >> gradeNum;
// USE THE BELOW AS A STANDARD TRANSFER DATA TEMPLATE
// while (sdStream >> eiD >> semester >> subject >> coursenumSD >> grade >> gradeNum)
// {
// hcStream >> subjectHC >> coursenumHC >> gpaHC >> codeHC;
// outputStream << endl << eiD + ' ' << semester + ' ' << subject + ' ' << coursenumSD + ' ' << grade + ' ' << gradeNum + ' ';
// }
while (sdStream >> eiD >> semester >> subject >> coursenumSD >> grade >> gradeNum) // while stream from SD file is open, execute below
{
while (hcStream >> subjectHC >> coursenumHC >> gpaHC >> codeHC) // while stream from HC file is open, execute below
{
if ((coursenumHC == coursenumSD) && (subject == subjectHC)) // while identifying info from file 1 = date from file 2, out put the below
{
outputStream << endl << eiD + ' ' << semester + ' ' << subject + ' ' << coursenumSD + ' ' << grade + ' ' << gradeNum + ' ' << gpaHC + ' ' << codeHC + ' ';
}
}
}
outputStream.close(); sdStream.close(); hcStream.close();
return 0;
}
希望尽管如此,这不会太费力。为了便于阅读,以下是有问题的循环:
while (sdStream >> eiD >> semester >> subject >> coursenumSD >> grade >> gradeNum) // while stream from SD file is open, execute below
{
while (hcStream >> subjectHC >> coursenumHC >> gpaHC >> codeHC) // while stream from HC file is open, execute below
{
if ((coursenumHC == coursenumSD) && (subject == subjectHC)) // while identifying info from file 1 = date from file 2, out put the below
{
outputStream << endl << eiD + ' ' << semester + ' ' << subject + ' ' << coursenumSD + ' ' << grade + ' ' << gradeNum + ' ' << gpaHC + ' ' << codeHC + ' ';
}
}
}
此输出是单行,成功匹配文件1(SD)的第一行与文件2(HC)中的相关数据。就是这样。循环结束。我向其他几个人展示了这段代码,他们告诉我问题是,当HC的输入流为SD的第二行打开时,它会在它停止的地方打开。我不确定是不是这样,但看起来似乎有道理。无论如何,我可以确保这个循环从文件2(HC)的开头到文件2的每一行的文件2的结尾循环吗?我已经尝试了我能想到的一切,从打开和关闭循环中的文件2的输入流到试验.eof()命令 - 虽然我不确定我是否正确使用它。