C++ Can';t读取文件并存储在结构的数据成员中
这是用于赋值的,所以我遵循所需结构布局的赋值准则以及重载。试图让我的程序读取每一行并将每一行分配给变量 文本文件如下所示:C++ Can';t读取文件并存储在结构的数据成员中,c++,input,struct,fstream,C++,Input,Struct,Fstream,这是用于赋值的,所以我遵循所需结构布局的赋值准则以及重载。试图让我的程序读取每一行并将每一行分配给变量 文本文件如下所示: John S Maggey G #include "iostream" #include "fstream" namespace { char buffer[1024]; int allocated = 0; } //=================================================================
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;
}
我的代码如下所示:
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;
}
变量中不会插入任何内容 如果这不是打字错误,并且您确实希望使用单个字符作为
姓氏
,那么您也应该将其作为单个字符阅读:
fin>>studentLoader[i].lastname>>std::ws
还考虑使用函数和类的阅读。这通常是一个好习惯,可以避免大量的失败。
通过稍微修改您的struct student
,将firstname
和lastname
的类型更改为std::string
,您将不必动态分配/取消分配内存,代码将减少一半
例如,您可以将其定义为:
struct student {
// constructor
student (std::stirng fn, std::stirng ln, int ID, int oc)
: firstname(fn), lastname(ln), studentID(ID), occupied(oc) { }
// data members
std::string firstname;
std::string lastname;
int studentID;
int occupied;
};
然后要从文件中读取并存储在struct student
,可以使用std::vector
,如下所示:
#include <iostream>
#include <string>
#include <vector>
#include <sstream>
int main () {
// stores all elements created from the reading of the file
std::vector<student> class_of_students;
// attach an input stream
std::ifstream fin("students.txt");
// check if file successfully opened
if (!fin) std::cerr << "Can't open input file!\n";
// line of text
std::string line;
// read file line by line
while (getline(fin, line)) {
// stream to extract data from a line
std::stringstream ss(line);
// input variables
std::string first_name;
std::string last_name;
int ID;
int occupied;
// example that assumes line format: "f_name l_name ID occ"
while (ss >> first_name >> last_name >> ID >> occupied) {
// store one element of type student to the vector
class_of_students.emplace_back(student(first_name, last_name, ID, occupied));
}
}
}
#包括
#包括
#包括
#包括
int main(){
//存储读取文件时创建的所有元素
std::向量类学生;
//附加输入流
std::ifstream fin(“students.txt”);
//检查文件是否成功打开
如果(!fin)std::cerr>名字>>姓氏>>ID>>已占用){
//将student类型的一个元素存储到向量
学生的班级。返回(学生(名字、姓氏、ID、占用));
}
}
}
更多关于和的使用
注:
此外,当您生成学生ID时,您需要它不仅是随机的,而且是唯一的。请使用
std::string
而不是char*
。另外,请不要使用new
delete
。您应该检查并删除任何不必要的代码(如new
和delete
重载运算符)。这是一项作业,因此我遵循要求。我们需要重载这些运算符以及使用char*。您可以从明智地缩进代码开始,这样代码实际上是可读的。为了看起来更好,进行了编辑,添加了关于我为什么使用char*以及重载new和delete运算符的说明。