【发布时间】:2016-01-18 00:29:56
【问题描述】:
这是一个分配,所以我遵循所需结构布局以及重载的分配准则。试图让我的程序读取每一行并将每一行分配给变量。
文本文件如下所示:
John
S
Maggey
G
我的代码如下:
#include "iostream"
#include "fstream"
namespace
{
char buffer[1024];
int allocated = 0;
}
//====================================================================
struct student
{
char *firstname;
char lastname;
int studentId;
int occupied;
student() : lastname(0), studentId(0), occupied(0)
{
firstname = new char[64];
for (int i = 0; i < 64; ++i)
firstname[i] = 0;
}
student(int s)
{
std::cout << "constructor" << std::endl;
std::cout << "Allocated: " << allocated << std::endl;
int currentLoc = allocated;
allocated += s;
firstname = new (&buffer[currentLoc]) char[s];
for (int i = 0; i < 64; ++i)
firstname[i] = 0;
}
void *operator new(size_t s)
{
std::cout << "Operator new allocated: " << allocated << std::endl;
int currentLoc = allocated;
allocated += s;
return &buffer[currentLoc];
}
void student::operator delete(void *ptr)
{
std::cout << "Delete called " << std::endl;
std::free(ptr);
}
student::~student()
{
}
};
//====================================================================
int main(int argc, char** argv)
{
student *studentLoader = new student[25];
std::fstream fin;
fin.open("students.txt");
char ln;
for (int i = 0; i < 25; ++i)
{
fin.getline(studentLoader[i].firstname, 99);
fin.getline(ln, 64);
studentLoader[i].lastname = ln;
studentLoader[i].studentId = (rand() % (9999 - 999)) + 999;
studentLoader[i].occupied = 1;
if ((i % 10) == 0)
{
std::cout << "First name: " << studentLoader[i].firstname << " Last initial: " << studentLoader[i].lastname << " ID: " << studentLoader[i].studentId << std::endl;
delete[] studentLoader;
}
}
fin.close();
return 0;
}
我也尝试过:
std::fstream fin;
fin.open("students.txt");
char ln;
for (int i = 0; i < 25; ++i)
{
fin.getline(studentLoader[i].firstname, 99);
fin.getline(studentLoader[i].lastname, 99);
studentLoader[i].lastname = ln;
studentLoader[i].studentId = (rand() % (9999 - 999)) + 999;
studentLoader[i].occupied = 1;
if ((i % 10) == 0)
{
std::cout << "First name: " << studentLoader[i].firstname << " Last initial: " << studentLoader[i].lastname << " ID: " << studentLoader[i].studentId << std::endl;
delete[] studentLoader;
}
}
fin.close();
return 0;
}
但第二次尝试 getline 时会收到错误。
尝试时
fin >> studentLoader[i].firstname;
不会在变量中插入任何内容。
【问题讨论】:
-
请使用
std::string而不是char*。也请不要newdelete。 -
您应该simplify your program 并删除任何不必要的代码(如
new和delete重载运算符)。 -
这是一个任务,所以我遵循要求。我们需要重载这些运算符并使用 char*。
-
你可以先明智地缩进你的代码,这样它实际上是可读的。
-
进行了编辑以使其看起来更好,添加了关于为什么我使用 char* 并重载 new 和 delete 运算符的说明。