【发布时间】:2018-03-16 16:06:10
【问题描述】:
我正在尝试按照我的指示将这两个循环组合在一起,但我无法弄清楚我应该如何做这样的事情。因为我在 for 循环中的计数器 i 不能进入 while 循环条件。我的老师希望程序只做一个循环。提前致谢。该代码基本上是通过一个txt文件运行的,应该首先将值分配给一个数组,然后在for循环中我将它分配给一个指针。
这部分我有问题:
void fillArr(vector <student> &arr, vector <student *> &ptrels){
student temp;
ifstream inFile ("index.txt");
while (!inFile.eof()) {
inFile >> temp.fName >> temp.Lname >> temp.gpa >> temp.id >> temp.email;
arr.push_back(temp);
}
for (unsigned i = 0; i < arr.size(); i++ ){
ptrels.push_back(&arr[i]);
}
// combine the two above loops
}
这是整个代码:
> #include <string>
> #include <cstdio>
> #include <iostream>
> #include <vector>
> #include <fstream>
> #include <sstream> using namespace std;
>
> struct student {
> string fName, Lname, email, id;
> double gpa; } ;
>
> void input(); void fillArr(vector <student> &arr, vector <student *>
> &ptrels); void printFile(vector <student *> pointarray); void
> sortFile(vector <student> &arr, vector <student *> &pointarray);
>
> int main() {
> vector <student> elements;
> vector <student *> ptrels;
>
> ifstream inFile;
> inFile.open("index.txt");
>
> int answer;
> fillArr(elements, ptrels);
> cout << "Please select:" << endl
> << "1 = Select All" << endl
> << "2 = Order A-Z by Name"<<endl
> << "3 = To exit"<< endl;
> cin >> answer ;
> if (answer == 1){
> printFile(ptrels);
> main();
> }
> if (answer ==2){
> sortFile(elements, ptrels);
> printFile(ptrels);
> main();
> }
> if (answer ==3){
> inFile.close();
> exit(0);
> }
> else {
> cout << "Invalid Try Again:"<< endl;
> main();
> }
> return 0; }
>
> void fillArr(vector <student> &arr, vector <student *> &ptrels){
> student temp;
>
> ifstream inFile ("index.txt");
> while (!inFile.eof()) {
> inFile >> temp.fName >> temp.Lname >> temp.gpa >> temp.id >> temp.email;
> arr.push_back(temp);
> }
> for (unsigned i = 0; i < arr.size(); i++ ){
> ptrels.push_back(&arr[i]);
> }
>
> // combine the two above loops }
>
>
>
> void printFile(vector <student *> pointarray){
> for (unsigned j = 0; j < pointarray.size(); j++){
> cout << pointarray[j] -> fName << " ";
> cout << pointarray[j] -> Lname<< " ";
> cout << pointarray[j] -> gpa << " ";
> cout << pointarray[j] -> id << " ";
> cout << pointarray[j] -> email << " ";
> cout << endl;
> } }
>
> //swap the elements by pointer. you are swaping the record not the
> pointers. // only sorting by firstname, sort by all 5 void
> sortFile(vector <student> &arr, vector <student *> &pointarray){
> for(unsigned i = 0; i < arr.size(); ++i){
> for(unsigned j = i + 1; j < arr.size(); ++j) {
> if(arr[i].fName > pointarray[j] -> fName) {
> swap(arr[i].fName,pointarray[j] ->fName);
> swap(arr[i].Lname,pointarray[j] ->Lname);
> swap(arr[i].gpa,pointarray[j] ->gpa);
> swap(arr[i].id,pointarray[j] ->id);
> swap(arr[i].email,pointarray[j] ->email);
> }
> }
> } }
我也知道我应该在另一个问题中提出这个问题,但她也希望我进行排序,这是 sortFile 的最后一个函数,它不仅按 firstName 对所有值进行排序。加上不知何故,她讨厌交换功能,寻找替代品。任何提示将不胜感激。
【问题讨论】:
-
我个人会通过完全删除第二个参数和第二个循环来解决它
-
你在哪里读到这样使用
while (!inFile.eof())? -
永远不要使用
eof作为循环条件。测试流故障。而您需要为输入操作执行此操作。 -
@SombreroChicken 不能那样做; arr 可能会重新分配内存,留下浮动指针
标签: c++ for-loop while-loop