所以我基本上只是尝试接受一些文件输入,然后将这些数据放入几个结构中。我遇到的唯一问题是指向结构的指针。结构本身应该代表学生,我想将每个指针设置为它们的名称而不是任意变量。我尝试以某种方式执行此操作,我假设它在语法上是错误的,因为它不起作用。在下面的代码中,我使用temp数组递增for循环,因为每个第4个位置都是新学生。关于如何解决这个问题的任何想法?
#include<iostream>
#include<iomanip>
#include"student.h"
#include"creditcard.h"
#include<fstream>
using namespace std;
int main ()
{
string creditcards[20];
int i;
int x;
int amount;
string temp[20];
ifstream infile;
string filename;
int count;
int numstudents;
string newstring="";
string pointers[20];
cout<<"enter the file name of which you've stored your"<<endl
<<"credit card infomation"<<endl;
getline(cin,filename,'\n');
infile.open(filename.c_str());
count=0;
getline(infile,temp[count],'\n');
while(! infile.eof())
{
count++;
getline(infile,temp[count],'\n');
numstudents= (count/4);
if(numstudents < 1 || count%4 != 0)
{
cout<<"incorrect data file"<<endl;
}
}
cout<<numstudents<<endl;
for(i=0,x=0; i<numstudents;i++,x+4)
{
student *temp[x];
temp[x] = new student;
pointers[i] = temp[x];
}
for(i=0;i<numstudents;i+4)
{
cout<<temp[i]<<endl;
}
return 0;
}
答案 0 :(得分:2)
好的,让我们从顶部开始吧。
你的代码是(在我重新格式化之前)一团糟。凌乱的代码更难阅读,更容易出错。
你有3个数组,每个数组包含20个字符串。你为什么需要这么多?
其中一个名为temp
;必须使用它作为变量名称是一个很好的指标,表明你在某处错误处理了数据。
您相对较早地宣布int count
,然后将其初始化为0。虽然不一定是坏事,但这不是最好的方法(在需要的时候同时做两件事)。
您可以在一行中声明多个局部变量,但不需要在函数顶部声明它们。这在C ++中是不必要的。
int main ()
{
string creditcards[20];
int i = 0, x = 0, amount = 0;
(合法,但可能不需要)
通常最好在您需要之前同时声明和初始化变量:
int count = 0;
getline(infile, temp[count], '\n');
我记得在推荐你之前看到这个阅读是不推荐的,尽管我并不完全确定。您可能想要更改此内容:
while ( !infile.eof() )
{
现在,我在这里看到的第一个实际错误是你读了一行,增加了count
,然后在行动之前读了另一行。这是故意的,如果有的话,为什么有必要?在循环内执行getline
和增量将更具可读性并且可能更可靠。
count++;
getline(infile, temp[count], '\n');
这一行是一个错误,我想:
for(i=0,x=0; i<numstudents;i++,x+4)
最后一部分i++, x+4
。它不会改变 x
。
之后的下一个循环处理i
的方式与此循环使用x
的方式相同,因此您可以将这两个循环组合起来。
现在,最重要的是,大量的临时数组不是解决这个问题(或者我能想到的任何其他问题)。
要存储此类数据,您需要查看std::map<std::string, student*>
或std::vector<student*>
。该向量将允许您在必要时将新的学生结构推到后面,并且地图将允许您根据名称对其进行键入并稍后检索,如下所示:
typdef map<string, student*> studentmap;
studentmap students;
studentmap::iterator iter = students.find("Bob");
if ( iter != students.end() )
{
student * bob = iter->second;
// Work with data
}
这是处理这个问题的更好方法,并且会从你正在做的事情中做出很多猜测。
答案 1 :(得分:1)
如果您希望能够按名称引用学生,请考虑使用map<string, student>
或map<string, student*>
。
这样您就可以通过students["Jack"]
或students["Jill"]
推荐个别学生。