我的while循环,旨在匹配来自两个文件的数据,仅在一行之后停止

时间:2016-02-21 21:14:38

标签: c++ loops

我正在为学校做一个项目。它相对简单,至少它似乎是:取一个文件(命名为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()命令 - 虽然我不确定我是否正确使用它。

0 个答案:

没有答案